/*
    Парус 8 - Панели мониторинга - ПУП - Информация о проектах
    Диалог фильтра
*/

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

import React, { useState, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Button, Dialog, DialogTitle, DialogContent, DialogActions } from "@mui/material"; //Интерфейсные элементы
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
import { BUTTONS } from "../../../app.text"; //Типовые тексты
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
import { FormField } from "./layouts"; //Общие компоненты панели

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

//Стили
const STYLES = {
    DIALOG_CONTENT: { overflowY: "auto", ...APP_STYLES.SCROLL }
};

//Структура фильтра
const FILTER_ITEMS = PropTypes.shape({
    prjType: PropTypes.string,
    insDep: PropTypes.string,
    priceStructStatus: PropTypes.number.isRequired,
    prjState: PropTypes.number.isRequired,
    search: PropTypes.string
});

//Начальное состояние фильтра
const FILTER_INITIAL = { prjType: "", insDep: "", priceStructStatus: 0, prjState: 0, search: "" };

//Статусы структуры цены
const PRICE_STRUCT_STATUS = [
    { value: 0, name: "Все" },
    { value: 1, name: "Есть статьи с расходом больше 90%" },
    { value: 2, name: "Есть статьи с перерасходом" }
];

//Состояния проекта
const PROJECT_STATE = [
    { value: 0, name: "Все" },
    { value: 1, name: "Открытые" },
    { value: 2, name: "Неоткрытые" }
];

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

//Диалог фильтра
const FilterDialog = ({ valuesInitial, onOk, onCancel }) => {
    //Собственное состояние элементов фильтра
    const [values, setValues] = useState({ ...valuesInitial });

    //Подключение к контексту приложения
    const { pOnlineShowDictionary } = useContext(ApplicationCtx);

    //Изменение элемента формы фильтра
    const handleValueChanged = (name, value) => setValues(pv => ({ ...pv, [name]: value }));

    //Сброс настроек фильтра
    const handleResetClick = () => setValues({ ...FILTER_INITIAL });

    //Сохранение фильтра
    const handleOkClick = () => (onOk ? onOk(values) : null);

    //Отмена фильтра
    const handleCancelClick = () => (onCancel ? onCancel() : null);

    //Выбор значения элемента формы из словаря
    const selectFromDictionary = (unitCode, name, applyValue) => {
        pOnlineShowDictionary({
            unitCode,
            showMethod: "main",
            inputParameters: [{ name: "in_CODE", value: values[name] }],
            callBack: res => applyValue(res.success ? [{ name, value: res.outParameters.out_CODE }] : null)
        });
    };

    //Генерация содержимого
    return (
        <Dialog open onClose={handleCancelClick} fullWidth maxWidth={"md"}>
            <DialogTitle>Фильтр отбора</DialogTitle>
            <DialogContent sx={STYLES.DIALOG_CONTENT}>
                <FormField
                    elementCode={"prjType"}
                    elementValue={values.prjType}
                    labelText={"Тип заказа"}
                    onChange={handleValueChanged}
                    dictionary={applyValue => selectFromDictionary("ProjectTypes", "prjType", applyValue)}
                />
                <FormField
                    elementCode={"insDep"}
                    elementValue={values.insDep}
                    labelText={"Подразделение-ответственный"}
                    onChange={handleValueChanged}
                    dictionary={applyValue => selectFromDictionary("INS_DEPARTMENT", "insDep", applyValue)}
                />
                <FormField
                    elementCode={"priceStructStatus"}
                    elementValue={values.priceStructStatus}
                    labelText={"Статус структуры цены"}
                    onChange={handleValueChanged}
                    list={PRICE_STRUCT_STATUS}
                />
                <FormField
                    elementCode={"prjState"}
                    elementValue={values.prjState}
                    labelText={"Состояние проекта"}
                    onChange={handleValueChanged}
                    list={PROJECT_STATE}
                />
            </DialogContent>
            <DialogActions sx={STYLES.DIALOG_ACTIONS}>
                <Button variant="text" onClick={handleOkClick}>
                    {BUTTONS.OK}
                </Button>
                <Button variant="text" onClick={handleResetClick}>
                    {BUTTONS.CLEAR}
                </Button>
                <Button variant="text" onClick={handleCancelClick}>
                    {BUTTONS.CANCEL}
                </Button>
            </DialogActions>
        </Dialog>
    );
};

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

//----------------
//Интерфейс модуля
//----------------

export { FILTER_ITEMS, FILTER_INITIAL, PRICE_STRUCT_STATUS, PROJECT_STATE, FilterDialog };
