/*
    Парус 8 - Панели мониторинга - ТОиР - Гаражка
    Компонент: Диалоговое окно фильтра отбора
*/

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

import React, { useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Dialog, DialogTitle, IconButton, Icon, DialogContent, DialogActions, Button, Box, TextField, InputAdornment } from "@mui/material"; //Интерфейсные компоненты
import { useDictionary, useProcedures } from "./hooks/dict_hooks"; //Хуки открытий разделов
import { hasValue, formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции

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

//Стили
const STYLES = {
    DIALOG_ACTIONS: { justifyContent: "flex-end" },
    CLOSE_BUTTON: {
        position: "absolute",
        right: 8,
        top: 8,
        color: theme => theme.palette.grey[500]
    },
    BOX_WITH_LEGEND: { border: "1px solid #939393", marginBottom: "1px" },
    LEGEND: { textAlign: "left" }
};

//--------------------------
//Вспомогательные компоненты
//--------------------------

//Проверка возможности выполнения действия
const isActionAllow = (filter, isFiltersInit = false) => {
    //Если указана "На дату", а также это не инициализация
    return hasValue(filter.dDate) && !isFiltersInit;
};

//---------------
//Тело компонента
//---------------

//Диалоговое окно фильтра отбора
const FilterDialog = ({ initial, isFiltersInit, onCancel, onOk }) => {
    //Собственное состояние
    const [filter, setFilter] = useState({ ...initial });

    //Вспомогательные функции открытия раздела
    const { handleInsDepartmentOpen } = useDictionary();

    //Вспомогательные функции
    const { handleInsDepartmentNameGet } = useProcedures();

    //Отработка воода значения в фильтр
    const handleValueChanged = e => {
        setFilter(pv => ({ ...pv, [e.target.name]: e.target.value, ...(e.target.name === "sCustomerDept" ? { sCustomerDeptName: "" } : {}) }));
    };

    //При изменении каталога фильтра
    const handleCustomerDeptSelect = () =>
        handleInsDepartmentOpen({
            sCode: filter.sCustomerDept,
            callBack: res => {
                setFilter(pv => ({ ...pv, sCustomerDept: res.outParameters.out_CODE, sCustomerDeptName: res.outParameters.out_NAME }));
            }
        });

    //При загрузке текущей даты
    const handleLoadCurrentDate = () => {
        //Определяем текущую дату
        const currentDate = formatDateJSONDateOnly(new Date());
        //Устанавливаем
        setFilter(pv => ({ ...pv, dDate: currentDate }));
    };

    //При очистке фильтра
    const handleClear = () => {
        setFilter({ dDate: "", sCustomerDept: "", sCustomerDeptName: "", dDateKOAFrom: "", dDateKOATo: "" });
    };

    //При закрытии диалога без изменения фильтра
    const handleCancel = () => (isActionAllow(initial, isFiltersInit) ? onCancel && onCancel() : null);

    //При закрытии диалога с изменением фильтра
    const handleOK = async () => {
        let filterRes = { ...filter };
        //Если наименование подразделения пустое
        if (!filterRes.sCustomerDeptName) {
            //Если мнемокоды подразделений совпадают
            filterRes.sCustomerDeptName =
                filterRes.sCustomerDept === initial.sCustomerDept
                    ? initial.sCustomerDeptName
                    : await handleInsDepartmentNameGet({ code: filterRes.sCustomerDept });
        }
        isActionAllow(filterRes) && onOk ? onOk(filterRes) : null;
    };

    //Генерация содержимого
    return (
        <div>
            <Dialog open onClose={handleCancel} fullWidth maxWidth="sm">
                <DialogTitle>Фильтр отбора</DialogTitle>
                <IconButton aria-label="close" onClick={handleCancel} sx={STYLES.CLOSE_BUTTON}>
                    <Icon>close</Icon>
                </IconButton>
                <DialogContent>
                    <Box sx={{ display: "flex", flexDirection: "column", gap: "10px" }}>
                        <TextField
                            name="dDate"
                            type="date"
                            InputLabelProps={{ shrink: true }}
                            value={filter.dDate}
                            onChange={handleValueChanged}
                            label="На дату"
                            variant="standard"
                            fullWidth
                            required
                            error={!filter.dDate}
                            InputProps={{
                                endAdornment: (
                                    <InputAdornment position="end">
                                        <IconButton aria-label={`dDate currentDate`} onClick={handleLoadCurrentDate} edge="end">
                                            <Icon>refresh</Icon>
                                        </IconButton>
                                    </InputAdornment>
                                )
                            }}
                        />
                        <TextField
                            name="sCustomerDept"
                            value={filter.sCustomerDept}
                            onChange={handleValueChanged}
                            label="Транспортный участок"
                            variant="standard"
                            InputProps={{
                                endAdornment: (
                                    <InputAdornment position="end">
                                        <IconButton aria-label={`sCustomerDept select`} onClick={handleCustomerDeptSelect} edge="end">
                                            <Icon>list</Icon>
                                        </IconButton>
                                    </InputAdornment>
                                )
                            }}
                            fullWidth
                        />
                        <Box sx={STYLES.BOX_WITH_LEGEND} component="fieldset">
                            <legend style={STYLES.LEGEND}>Расчет КТГ/КОА</legend>
                            <TextField
                                name="dDateKOAFrom"
                                type="datetime-local"
                                InputLabelProps={{ shrink: true }}
                                value={filter.dDateKOAFrom}
                                onChange={handleValueChanged}
                                label="Дата с"
                                variant="standard"
                                fullWidth
                            />
                            <TextField
                                name="dDateKOATo"
                                type="datetime-local"
                                InputLabelProps={{ shrink: true }}
                                value={filter.dDateKOATo}
                                onChange={handleValueChanged}
                                label="Дата по"
                                variant="standard"
                                fullWidth
                            />
                        </Box>
                    </Box>
                </DialogContent>
                <DialogActions sx={STYLES.DIALOG_ACTIONS}>
                    <Button variant="text" disabled={!isActionAllow(filter)} onClick={handleOK}>
                        Применить
                    </Button>
                    <Button variant="text" onClick={handleClear}>
                        Очистить
                    </Button>
                    <Button variant="text" disabled={!isActionAllow(initial, isFiltersInit)} onClick={handleCancel}>
                        Отмена
                    </Button>
                </DialogActions>
            </Dialog>
        </div>
    );
};

//Контроль свойств компонента - Диалоговое окно фильтра отбора
FilterDialog.propTypes = {
    initial: PropTypes.object.isRequired,
    isFiltersInit: PropTypes.bool,
    onOk: PropTypes.func,
    onCancel: PropTypes.func
};

//--------------------
//Интерфейс компонента
//--------------------

export { FilterDialog };
