/*
    Парус 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 } from "../../core/utils"; //Вспомогательные функции

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

//Стили
const STYLES = {
    DIALOG_ACTIONS: { justifyContent: "flex-end" },
    CLOSE_BUTTON: {
        position: "absolute",
        right: 8,
        top: 8,
        color: theme => theme.palette.grey[500]
    }
};

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

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

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

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

    //Вспомогательные функции открытия раздела
    const { handleInsDepartmentOpen, handleEquipTypeWorksOpen, handleEquipWorkKindsOpen, handleEquipConfigurationOpen } = 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 handleTypeWorkSelect = () =>
        handleEquipTypeWorksOpen({
            sCode: filter.sWorkType,
            callBack: res => {
                setFilter(pv => ({ ...pv, sWorkType: res.outParameters.out_CODE }));
            }
        });

    //При изменении вида типовых работ
    const handleWorkKindSelect = () =>
        handleEquipWorkKindsOpen({
            sCode: filter.sWorkKind,
            callBack: res => {
                setFilter(pv => ({ ...pv, sWorkKind: res.outParameters.out_CODE }));
            }
        });

    //При изменении технического объекта
    const handleEqconfigSelect = () =>
        handleEquipConfigurationOpen({
            sCode: filter.sEqconfig,
            callBack: res => {
                console.log(res.outParameters);
                setFilter(pv => ({ ...pv, sEqconfig: res.outParameters.out_CODE }));
            }
        });

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

    //При закрытии диалога без изменения фильтра
    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="dDateBegin"
                            type="date"
                            InputLabelProps={{ shrink: true }}
                            value={filter.dDateBegin}
                            onChange={handleValueChanged}
                            label="Дата с"
                            variant="standard"
                            fullWidth
                            required
                            error={!filter.dDateBegin}
                        />
                        <TextField
                            name="dDateEnd"
                            type="date"
                            InputLabelProps={{ shrink: true }}
                            value={filter.dDateEnd}
                            onChange={handleValueChanged}
                            label="Дата по"
                            variant="standard"
                            fullWidth
                            required
                            error={!filter.dDateEnd}
                        />
                        <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
                        />
                        <TextField
                            name="sWorkType"
                            value={filter.sWorkType}
                            onChange={handleValueChanged}
                            label="Типовая работа"
                            variant="standard"
                            InputProps={{
                                endAdornment: (
                                    <InputAdornment position="end">
                                        <IconButton aria-label={`sWorkType select`} onClick={handleTypeWorkSelect} edge="end">
                                            <Icon>list</Icon>
                                        </IconButton>
                                    </InputAdornment>
                                )
                            }}
                            fullWidth
                        />
                        <TextField
                            name="sWorkKind"
                            value={filter.sWorkKind}
                            onChange={handleValueChanged}
                            label="Вид типовых работ"
                            variant="standard"
                            InputProps={{
                                endAdornment: (
                                    <InputAdornment position="end">
                                        <IconButton aria-label={`sWorkKind select`} onClick={handleWorkKindSelect} edge="end">
                                            <Icon>list</Icon>
                                        </IconButton>
                                    </InputAdornment>
                                )
                            }}
                            fullWidth
                        />
                        <TextField
                            name="sEqconfig"
                            value={filter.sEqconfig}
                            onChange={handleValueChanged}
                            label="Технический объект"
                            variant="standard"
                            InputProps={{
                                endAdornment: (
                                    <InputAdornment position="end">
                                        <IconButton aria-label={`sEqconfig select`} onClick={handleEqconfigSelect} edge="end">
                                            <Icon>list</Icon>
                                        </IconButton>
                                    </InputAdornment>
                                )
                            }}
                            fullWidth
                        />
                    </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 };
