/*
    Парус 8 - Панели мониторинга - Редактор панелей
    Дополнительная разметка и вёрстка клиентских элементов
*/

//---------------------
//Подключение библиотек
//---------------------

import React, { useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { InputLabel, Input, IconButton, Icon, Button } from "@mui/material"; //Интерфейсные компоненты
import { TEXTS } from "../../../app.text"; //Общие текстовые ресурсы приложения
import { P8PAppProgress } from "../../components/p8p_app_progress"; //Индикатор процесса

//---------
//Константы
//---------

//Стили
const STYLES = {
    INPUT_FILE: { display: "none" },
    INPUT_LABEL: { display: "contents" }
};

//-----------
//Тело модуля
//-----------

//Компонент "Загрузка из файла"
const ImportPanel = ({ id, buttonView, onClick, disabled = false }) => {
    //Состояние загрузки файла
    const [loading, setLoading] = useState(false);

    //При выборе файла
    const handleChange = event => {
        //Если файл выбран
        if (event.target.files[0]) {
            //Инициализируем считыватель файла
            const reader = new FileReader();
            //Обработчик начала считывания данных
            reader.onloadstart = () => setLoading(true);
            //Обработчик считывания данных
            reader.onload = async e => {
                //Обрабатываем текст файла
                onClick(e.target.result);
                setLoading(false);
            };
            //Обработчик ошибки считывания данных
            reader.onerror = () => setLoading(false);
            //Загружаем данные из файла
            reader.readAsText(event.target.files[0]);
        }
        //Очищаем значение
        event.target.value = null;
    };

    //Генерация содержимого
    return (
        <>
            {loading ? <P8PAppProgress open={true} text={TEXTS.LOADING} /> : null}
            <InputLabel htmlFor={id} sx={STYLES.INPUT_LABEL}>
                <Input
                    id={id}
                    type="file"
                    hidden
                    onChange={handleChange}
                    sx={STYLES.INPUT_FILE}
                    inputProps={{ accept: ".xml" }}
                    disabled={disabled}
                />
                {buttonView}
            </InputLabel>
        </>
    );
};

//Контроль свойств - Компонент "Загрузка из файла"
ImportPanel.propTypes = {
    id: PropTypes.string.isRequired,
    buttonView: PropTypes.object.isRequired,
    onClick: PropTypes.func.isRequired,
    disabled: PropTypes.bool
};

//Генерация действия "Загрузить из файла" меню действий
export const toolbarImportRenderer = ({ icon, title, disabled, onClick }) => {
    //Представление кнопки загрузки
    let importButtonView = (
        <IconButton title={title} disabled={disabled}>
            <Icon>{icon}</Icon>
        </IconButton>
    );
    //Генерация содержимого
    return <ImportPanel id={"input-file-loader-toolbar"} buttonView={importButtonView} onClick={onClick} disabled={disabled} />;
};

//Компонент кнопки импорта панели из файла
export const ImportPanelButton = ({ id, startIcon, title, onClick }) => {
    //Представление кнопки загрузки
    let importButtonView = (
        <Button startIcon={startIcon ? <Icon>{startIcon}</Icon> : null} component="span">
            {title}
        </Button>
    );
    //Генерация содержимого
    return <ImportPanel id={id} buttonView={importButtonView} onClick={onClick} />;
};

//Контроль свойств - Компонент кнопки импорта панели из файла
ImportPanelButton.propTypes = {
    id: PropTypes.string.isRequired,
    startIcon: PropTypes.string,
    title: PropTypes.string.isRequired,
    onClick: PropTypes.func.isRequired
};

//Выгрузка XML файла
export const exportXMLFile = (data, fileName) => {
    //Переводим в данные для файла
    const blobData = new Blob([data], { type: "text/plain" });
    //Формируем URL
    const url = URL.createObjectURL(blobData);
    //Делаем линк и устанавливаем параметры, после добавляем в DOM
    const a = document.createElement("a");
    a.href = url;
    a.download = `${fileName.replace(/[/\\?%*:|"<>.,;= ]/g, "_")}.xml`;
    document.body.appendChild(a);
    //Выполняем открытие ссылки
    a.click();
    //Очищаем от лишних данных
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
};
