/*
    Парус 8 - Панели мониторинга - УДП - Доски задач
    Компонент: Вкладка информации со свойствами
*/

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

import React from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Box, TextField } from "@mui/material"; //Интерфейсные компоненты
import { getInputProps } from "./task_form"; //Формирование кнопки доступа к разделу
import dayjs from "dayjs"; //Работа с датами
import customParseFormat from "dayjs/plugin/customParseFormat"; //Настройка пользовательского формата даты
import { DP_DEFAULT_VALUE, DP_IN_VALUE, DP_RETURN_VALUE, validationError, formatSqlDate } from "../layouts"; //Дополнительная разметка и вёрстка клиентских элементов
import { COMMON_STYLES } from "../styles"; //Общие стили
import { useDictionary } from "../hooks/dict_hooks"; //Состояние открытия разделов

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

//Стили
const STYLES = {
    BOX_FEW_COLUMNS: { display: "flex", flexWrap: "wrap", justifyContent: "space-between" }
};

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

//Подключение настройки пользовательского формата даты
dayjs.extend(customParseFormat);

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

//Вкладка информации со свойствами
const TaskFormTabProps = ({ task, docProps, onPropEdit }) => {
    //Вспомогательные функции открытия раздела
    const { handleExtraDictionariesOpen, handleUnitOpen } = useDictionary();

    //Выбор из словаря или дополнительного словаря
    const handleDictOpen = async (docProp, curValue = null) => {
        //Если способ выбора - словарь
        docProp.NENTRY_TYPE === 1
            ? handleUnitOpen({
                  sUnitCode: docProp.SUNITCODE,
                  sShowMethod: docProp.SMETHOD_CODE,
                  inputParameters: docProp.NPARAM_RN ? [{ name: docProp.SPARAM_IN_CODE, value: curValue }] : null,
                  callBack: res => {
                      onPropEdit(docProp.SFORMATTED_ID, res.outParameters[docProp.SPARAM_OUT_CODE]);
                  }
              })
            : //Если способ выбора - доп. словарь
              handleExtraDictionariesOpen({
                  nRn: docProp.NEXTRA_DICT_RN,
                  sParamName: DP_IN_VALUE[docProp.NFORMAT],
                  paramValue: curValue,
                  callBack: res => {
                      onPropEdit(docProp.SFORMATTED_ID, res.outParameters[DP_RETURN_VALUE[docProp.NFORMAT]]);
                  }
              });
    };

    //Инициализация дополнительного свойства
    const initPropValue = prop => {
        //Считываем значение свойства из события
        const value = task.docProps[prop.SFORMATTED_ID];
        //Если есть значение свойства
        if (value) {
            //Строка или число
            if (prop.NFORMAT < 2) {
                return prop.NNUM_PRECISION ? String(value).replace(".", ",") : value;
            }
            //Дата
            if (prop.NFORMAT === 2) {
                //Возвращаем значение исходя из подтипа даты
                switch (prop.NDATA_SUBTYPE) {
                    //Дата без времени
                    case 0:
                        return dayjs(value).format("YYYY-MM-DD");
                    //Дата и время без секунд
                    case 1:
                        return dayjs(value).format("YYYY-MM-DD HH:mm");
                    //Дата и время с секундами
                    default:
                        return dayjs(value).format("YYYY-MM-DD HH:mm:ss");
                }
            }
            //Если это ничего из вышестоящего - время
            return formatSqlDate(value);
        }
        //Если нет значения, но это изменение события
        if (task.nRn) {
            //Возвращаем пустоту
            return "";
        }
        //Если нет значения и это добавление события - возвращаем значение по умолчанию
        return prop[DP_DEFAULT_VALUE[prop.NFORMAT]];
    };

    //Генерация содержимого
    return (
        <Box>
            <Box sx={COMMON_STYLES.BOX_WITH_LEGEND} component="fieldset">
                <Box sx={STYLES.BOX_FEW_COLUMNS}>
                    {docProps.map((docProp, index) => {
                        return docProp.BSHOW_IN_GRID ? (
                            <TextField
                                error={
                                    !validationError(
                                        task.docProps[docProp.SFORMATTED_ID],
                                        docProp.NFORMAT,
                                        docProp.NNUM_WIDTH,
                                        docProp.NNUM_PRECISION,
                                        docProp.NSTR_WIDTH
                                    )
                                }
                                key={index}
                                sx={COMMON_STYLES.TASK_FORM_TEXT_FIELD()}
                                id={docProp.SFORMATTED_ID}
                                type={
                                    docProp.NFORMAT < 2
                                        ? "string"
                                        : docProp.NFORMAT === 2
                                        ? docProp.NDATA_SUBTYPE === 0
                                            ? "date"
                                            : "datetime-local"
                                        : "time"
                                }
                                label={docProp.SNAME}
                                fullWidth
                                value={initPropValue(docProp)}
                                variant="standard"
                                onChange={e => onPropEdit(e.target.id, e.target.value)}
                                inputProps={
                                    (docProp.NFORMAT === 2 && docProp.NDATA_SUBTYPE === 2) || (docProp.NFORMAT === 3 && docProp.NDATA_SUBTYPE === 1)
                                        ? { step: 1 }
                                        : {}
                                }
                                InputProps={
                                    docProp.NENTRY_TYPE > 0
                                        ? getInputProps(() => handleDictOpen(docProp, task.docProps[docProp.SFORMATTED_ID]))
                                        : null
                                }
                                InputLabelProps={
                                    docProp.NFORMAT < 2
                                        ? {}
                                        : {
                                              shrink: true
                                          }
                                }
                                required={docProp.BREQUIRE}
                                disabled={docProp.BREADONLY}
                            />
                        ) : null;
                    })}
                </Box>
            </Box>
        </Box>
    );
};

//Контроль свойств - Вкладка информации со свойствами
TaskFormTabProps.propTypes = {
    task: PropTypes.object.isRequired,
    docProps: PropTypes.array.isRequired,
    onPropEdit: PropTypes.func.isRequired
};

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

export { TaskFormTabProps };
