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

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

import React, { useState, useEffect, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import {
    Stack,
    Card,
    CardContent,
    Typography,
    Button,
    Link,
    Dialog,
    DialogTitle,
    DialogContent,
    DialogActions,
    Paper,
    Box,
    Tabs,
    Tab
} from "@mui/material"; //Интерфейсные компоненты
import { useTheme } from "@mui/material/styles"; //Темы оформления
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с серверомs
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { BUTTONS, TEXTS } from "../../../app.text"; //Текстовые ресурсы и константы
import { P8PAppInlineError } from "../../components/p8p_app_message"; //Встраиваемое сообщение об ошибке
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
import { formatDateRF, xml2JSON } from "../../core/utils"; //Вспомогательные функции
import {
    SCROLL_STYLES,
    formatModelStateValue,
    selectMeasureUnit,
    selectUserProcsData,
    selectServiceFn,
    IUDFormTextField,
    TabPanel
} from "./eqs_tech_cond_forecast_layout"; //Общие вспомогательные компоненты и вёрстка
import { DS_RN_DEFAULT, useEquipDataSelectionList } from "./eqs_tech_cond_forecast_hooks"; //Общие вспомогательные хуки
import { P8PChart } from "../../components/p8p_chart"; //График

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

//Стили
const STYLES = {
    TECH_OBJ_CARD_DIALOG: { maxWidth: "800px" },
    TECH_OBJ_CARD_DIALOG_CONTENT: { ...SCROLL_STYLES },
    TECH_OBJ_CARD_ML_TABLE: {
        maxHeight: "200px",
        ...SCROLL_STYLES
    },
    TECH_OBJ_CARD_FORECAST_TABLE: {
        maxHeight: "200px",
        ...SCROLL_STYLES
    },
    TECH_OBJ_FORECAST_DETAIL_DIALOG: { maxWidth: "600px" },
    TECH_OBJ_FORECAST_DETAIL_CHART: { display: "flex", alignItems: "center", justifyContent: "center", paddingTop: "20px" },
    TECH_OBJ_MAKE_DATASET_DIALOG_CONTENT: { minHeight: "40vh", maxHeight: "40vh", ...SCROLL_STYLES },
    TECH_OBJ_MAKE_DATASET_DIALOG_TABS_CONTAINER: { borderBottom: 1, borderColor: "divider" },
    FORECAST_DETAIL_NOTE: { display: "block", marginTop: "-5px" }
};

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

//Форматирование ячеек заголовка таблицы моделей единицы оборудования
const techObjCardModelsTableHeadCellRender = ({ columnDef }) => {
    switch (columnDef.name) {
        case "NSTATUS":
            return {
                stackProps: { justifyContent: "left" },
                cellProps: { align: "left" }
            };
        case "SACTIONS":
            return { data: " " };
    }
};

//Форматирование колонок таблицы моделей единицы оборудования
const techObjCardModelsTableDataCellRender = ({ row, columnDef, theme, onGoToModel, onGetPrediction }) => {
    switch (columnDef.name) {
        case "SNEQUIPDS":
        case "STASK":
        case "NPRECISION":
            return {
                data: (
                    <Link component="button" variant="body2" align="left" underline="hover" onClick={() => onGoToModel(row)}>
                        {`${row[columnDef.name]}${columnDef.name == "NPRECISION" && row.NSTATUS == 2 ? ` ${row.SDICMUNTS}` : ""}`}
                    </Link>
                )
            };
        case "NSTATUS":
            return {
                cellProps: { align: "left" },
                data: formatModelStateValue(theme, row.NSTATUS, row.SERR)
            };
        case "SACTIONS":
            return {
                data:
                    row.NSTATUS == 2 ? (
                        <Button variant="outlined" color="success" onClick={() => onGetPrediction(row)}>
                            Прогноз
                        </Button>
                    ) : null
            };
    }
};

//Форматирование заголовка таблицы истории прогнозов класса оборудования выборки данных
const techObjCardForecastListTableHeadCellRender = ({ columnDef }) => {
    switch (columnDef.name) {
        case "STO_FORECAST_DESC":
            return {
                stackProps: { justifyContent: "right" },
                cellProps: { align: "right" }
            };
    }
};

//Форматирование колонок таблицы истории прогнозов класса оборудования выборки данных
const techObjCardForecastListTableDataCellRender = ({ row, columnDef, onShowForecastDetail }) => {
    switch (columnDef.name) {
        case "STO_FORECAST_DESC":
            return {
                cellProps: { align: "right" },
                data: row.STO_FORECAST_DESC ? (
                    <Button variant="outlined" color={row.STO_FORECAST_DESC_COLOR} onClick={() => onShowForecastDetail(row)}>
                        {row.STO_FORECAST_DESC}
                    </Button>
                ) : null
            };
    }
};

//Детали прогноза
const ForecastDetail = ({ date, forecast, onClose }) => {
    //Собственное состояние - сведения о прогнозе
    const [details, setDetails] = useState({
        taskName: null,
        forecastDate: null,
        forecastDays: null,
        forecastDateCalc: null,
        forecastDateNow: null,
        forecastDaysNow: null,
        nextRepair: null,
        breakDown: null,
        breakDownColor: null
    });

    //Собственное состояние - график
    const [chart, setChart] = useState({ loaded: false, available: true, labels: [], datasets: [] });

    //При подключении к странице
    useEffect(() => {
        const loadChart = async () => {
            const data = await xml2JSON({ xmlDoc: forecast });
            setDetails({
                taskName: data.XDATA.STASK_NAME,
                forecastDate: data.XDATA.SFORECAST_DATE,
                forecastDays: data.XDATA.NFORECAST_DAYS,
                forecastDateCalc: data.XDATA.SFORECAST_DATE_CALC,
                forecastDateNow: data.XDATA.SFORECAST_DATE_NOW,
                forecastDaysNow: data.XDATA.NFORECAST_DAYS_NOW,
                nextRepair: data.XDATA.DNEXT_REPAIR,
                breakDown: data.XDATA.NBREAKDOWN_PROB,
                breakDownColor: data.XDATA.SBREAKDOWN_PROB_COLOR
            });
            if (data.XDATA.XCHART) {
                const chart = await xml2JSON({ xmlDoc: data.XDATA.XCHART });
                setChart(pv => ({ ...pv, loaded: true, ...chart.XDATA.XCHART }));
            } else setChart(pv => ({ ...pv, available: false }));
        };
        loadChart();
        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, []);

    //Генерация содержимого
    return (
        <Dialog open={true} onClose={() => (onClose ? onClose() : null)} {...STYLES.TECH_OBJ_FORECAST_DETAIL_DIALOG}>
            <DialogTitle>{`Детали прогноза от ${date}`}</DialogTitle>
            <DialogContent>
                <Typography variant="subtitle1">
                    {details.taskName} на дату выборки ({`${details.forecastDate}`}):{" "}
                    <b>{`${details.forecastDays} д (до ${details.forecastDateCalc})*`}</b>
                </Typography>
                <Typography variant="caption" color={"text.secondary"} sx={STYLES.FORECAST_DETAIL_NOTE}>
                    *по данным фреймворка прогнозирования
                </Typography>
                <Typography variant="subtitle1">
                    {details.taskName} на сегодня ({`${details.forecastDateNow}`}): <b>{`${details.forecastDaysNow} д*`}</b>
                </Typography>
                <Typography variant="caption" color={"text.secondary"} sx={STYLES.FORECAST_DETAIL_NOTE}>
                    *по данным фреймворка прогнозирования
                </Typography>
                <Stack direction={"row"}>
                    <Typography variant="subtitle1">Дата следующего ТО/ремонта:&nbsp;</Typography>
                    <Typography variant="subtitle1" color={details.nextRepair ? "" : "error.main"}>
                        <b>{details.nextRepair ? `${formatDateRF(details.nextRepair)}*` : "Нет графиков ТО и ремонтов/ремонтых ведомостей"}</b>
                    </Typography>
                </Stack>
                {details.nextRepair ? (
                    <Typography variant="caption" color={"text.secondary"} sx={STYLES.FORECAST_DETAIL_NOTE}>
                        *по графику/ремонтной ведомости
                    </Typography>
                ) : null}
                <Stack direction={"row"}>
                    <Typography variant="subtitle1">Bероятность перехода в критическое состояние:&nbsp;</Typography>
                    <Typography variant="subtitle1" color={details.breakDownColor}>
                        <b>{`${details.breakDown}%*`}</b>
                    </Typography>
                </Stack>
                <Typography variant="caption" color={"text.secondary"} sx={STYLES.FORECAST_DETAIL_NOTE}>
                    *до даты следующего ТО/ремонта по графику/ремонтной ведомости
                </Typography>
                {chart.loaded && (
                    <>
                        <P8PChart {...chart} style={STYLES.TECH_OBJ_FORECAST_DETAIL_CHART} />
                        <Typography variant="caption" color={"text.secondary"} sx={STYLES.FORECAST_DETAIL_NOTE} pt={2}>
                            При расчёте вероятности принято, что она имеет равномерную функцию распределения на интервале [a, b],
                            <br />
                            где a = 0 (текущий момент времени), b = количество дней до выхода из строя от текущего момента времени,
                            <br />
                            полученное от фреймворка прогнозирования
                        </Typography>
                    </>
                )}
                {!chart.available && (
                    <Box p={5}>
                        <Paper elevation={6}>
                            <Box p={5}>
                                <Typography variant="body" color={"text.secondary"}>
                                    Зарегистрируйте графики ТО и ремонтов/ремонтные ведомости <br />
                                    для отображения диаграммы прогнозирования.
                                </Typography>
                            </Box>
                        </Paper>
                    </Box>
                )}
            </DialogContent>
            <DialogActions>
                <Button onClick={() => (onClose ? onClose() : null)}>{BUTTONS.CLOSE}</Button>
            </DialogActions>
        </Dialog>
    );
};

//Контроль свойств - Детали прогноза
ForecastDetail.propTypes = {
    date: PropTypes.string.isRequired,
    forecast: PropTypes.string.isRequired,
    onClose: PropTypes.func
};

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

//Формирование значения для колонки "Модель" таблицы технических объектов
const formatTechObjCMMLStatusValue = value => (value == 0 ? "Обучить" : value == 1 ? "Обучается" : "Прогнозировать");

//Формирование цвета для колонки "Модель" таблицы технических объектов
const formatTechObjCMMLStatusColor = value => (value == 0 ? "primary" : value == 1 ? "warning" : "success");

//Форматирование значений колонок таблицы технических объектов
const eqConfigTechObjTableValueFormatter = ({ value, columnDef }) => {
    switch (columnDef.name) {
        case "DOPER_DATE":
            return formatDateRF(value);
        case "NCMML_STATUS":
            return formatTechObjCMMLStatusValue(value);
    }
    return value;
};

//Форматирование колонок таблицы технических объектов
const eqConfigTechObjTableDataCellRender = ({ row, columnDef, onCMMLStatus }) => {
    switch (columnDef.name) {
        case "NCMML_STATUS":
            return {
                data: (
                    <Button
                        variant="outlined"
                        color={formatTechObjCMMLStatusColor(row[columnDef.name])}
                        onClick={event => (onCMMLStatus ? onCMMLStatus(event, row) : null)}
                    >
                        {formatTechObjCMMLStatusValue(row[columnDef.name])}
                    </Button>
                )
            };
        case "NBREAKDOWN_PROB":
            return {
                data:
                    row[columnDef.name] !== null && row[columnDef.name] !== "" ? (
                        <Button
                            variant="outlined"
                            color={row.SBREAKDOWN_PROB_COLOR}
                            onClick={event => (onCMMLStatus ? onCMMLStatus(event, row) : null)}
                        >
                            {`${row[columnDef.name]}%`}
                        </Button>
                    ) : null
            };
    }
};

//Карточка технического объекта
const TechObjCard = ({
    cardData,
    modelsList,
    forecastHistList,
    onClose,
    onGoToModel,
    onGetPrediction,
    onChangeEqTchSrv,
    onMakeEqRpSheet,
    onCardDataRefresh
}) => {
    //Подключение к контексту приложения
    const { pOnlineShowDictionary } = useContext(ApplicationСtx);

    //Подключение к контексту взаимодействия с сервером
    const { executeStored } = useContext(BackEndСtx);

    //Подключение к контексту сообщений
    const { showMsgErr } = useContext(MessagingСtx);

    //Подключаемся к теме
    const theme = useTheme();

    //Собственное состояние
    const [state, setState] = useState({ forecastDetail: null, forecastDate: null });

    //При нажатии на кнопку закрытия карточки
    const handleClose = () => (onClose ? onClose() : null);

    //При нажатии на переход к модели
    const handleGoToModelClick = model => (onGoToModel ? onGoToModel(model) : null);

    //При нажатии на запрос предсказания
    const handleGetPredictionClick = model => (onGetPrediction ? onGetPrediction(model) : null);

    //При нажатии на изменение графика ТО и ремонтов
    const handleChangeEqTchSrvClick = () => (onChangeEqTchSrv ? onChangeEqTchSrv() : null);

    //При нажатии на формирование ремонтной ведомости
    const handleMakeEqRpSheetClick = () => (onMakeEqRpSheet ? onMakeEqRpSheet() : null);

    //При нажатии на отображение деталей прогноза
    const handleShowForecastDetailClick = modelHist => {
        setState(pv => ({ ...pv, forecastDetail: modelHist.STO_FORECAST_CARD, forecastDate: modelHist.SRQ_DATE }));
    };

    //При нажатии на закрытие деталей прогноза
    const handleCloseForecastDetailClick = () => setState(pv => ({ ...pv, forecastDetail: null, forecastDate: null }));

    //При нажатии на дату следующего обслуживания согласно графику ТО и ремонтов
    const handleNextRepairClick = async () => {
        const data = await executeStored({ stored: "UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_SELECT_EQTCHSRV", args: { NEQCONFIG: cardData.NRN } });
        if (data.NIDENT)
            pOnlineShowDictionary({
                unitCode: "EquipTechServices",
                inputParameters: [{ name: "in_Ident", value: data.NIDENT }],
                callBack: () => (onCardDataRefresh ? onCardDataRefresh() : null)
            });
        else showMsgErr(TEXTS.NO_DATA_FOUND);
    };

    //При нажатии надату следующего ремонта согласно ремонтной ведомости
    const handleNextRepairSheetClick = async () => {
        const data = await executeStored({ stored: "UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_SELECT_EQRPSHT", args: { NEQCONFIG: cardData.NRN } });
        if (data.NIDENT)
            pOnlineShowDictionary({
                unitCode: "EquipRepairSheets",
                showMethod: "main_selected",
                inputParameters: [{ name: "in_Ident", value: data.NIDENT }],
                callBack: () => (onCardDataRefresh ? onCardDataRefresh() : null)
            });
        else showMsgErr(TEXTS.NO_DATA_FOUND);
    };

    //Генерация содержимого
    return (
        <>
            {state.forecastDetail ? (
                <ForecastDetail date={state.forecastDate} forecast={state.forecastDetail} onClose={handleCloseForecastDetailClick} />
            ) : null}
            <Dialog open={true} onClose={handleClose} {...STYLES.TECH_OBJ_CARD_DIALOG}>
                <DialogTitle>{cardData.SCODE}</DialogTitle>
                <DialogContent sx={STYLES.TECH_OBJ_CARD_DIALOG_CONTENT}>
                    <Typography variant="h6">{cardData.SNAME}</Typography>
                    <Stack spacing={2}>
                        <Stack>
                            <Typography color="text.secondary" variant="caption">
                                {`${formatDateRF(cardData.DOPER_DATE)}, ${cardData.SEQOBJKIND}`}
                            </Typography>
                            <Typography color="text.secondary" variant="caption">
                                Следующее ТО/ремонт по графику (план):{" "}
                                {cardData.DNEXT_EQTCHSRV ? (
                                    <Link component="button" variant="body2" align="left" underline="hover" onClick={handleNextRepairClick}>
                                        {cardData.DNEXT_EQTCHSRV}
                                    </Link>
                                ) : (
                                    <Typography color="error" variant="caption">
                                        Нет графиков ТО и ремонтов
                                    </Typography>
                                )}
                            </Typography>
                            <Typography color="text.secondary" variant="caption" gutterBottom>
                                Включен в ремонты на (факт):{" "}
                                {cardData.DNEXT_EQRPSHEET ? (
                                    <Link component="button" variant="body2" align="left" underline="hover" onClick={handleNextRepairSheetClick}>
                                        {cardData.DNEXT_EQRPSHEET}
                                    </Link>
                                ) : (
                                    <Typography color="error" variant="caption">
                                        Нет ремонтных ведомостей
                                    </Typography>
                                )}
                            </Typography>
                        </Stack>
                        {modelsList.init ? (
                            <Card elevation={6}>
                                <CardContent>
                                    <Typography variant="h6" component="div">
                                        Модели
                                    </Typography>
                                    <P8PDataGrid
                                        {...{ ...P8P_DATA_GRID_CONFIG_PROPS }}
                                        containerComponentProps={{ sx: STYLES.TECH_OBJ_CARD_ML_TABLE, elevation: 0 }}
                                        columnsDef={modelsList.columnsDef}
                                        rows={modelsList.rows}
                                        size={P8P_DATA_GRID_SIZE.SMALL}
                                        morePages={false}
                                        fixedHeader={true}
                                        reloading={false}
                                        headCellRender={techObjCardModelsTableHeadCellRender}
                                        dataCellRender={prms =>
                                            techObjCardModelsTableDataCellRender({
                                                ...prms,
                                                theme,
                                                onGoToModel: handleGoToModelClick,
                                                onGetPrediction: handleGetPredictionClick
                                            })
                                        }
                                    />
                                </CardContent>
                            </Card>
                        ) : null}
                        {forecastHistList.init ? (
                            <Card elevation={6}>
                                <CardContent>
                                    <Typography variant="h6" component="div">
                                        Прогнозы
                                    </Typography>
                                    <P8PDataGrid
                                        {...{ ...P8P_DATA_GRID_CONFIG_PROPS }}
                                        containerComponentProps={{ sx: STYLES.TECH_OBJ_CARD_FORECAST_TABLE, elevation: 0 }}
                                        columnsDef={forecastHistList.columnsDef}
                                        rows={forecastHistList.rows}
                                        size={P8P_DATA_GRID_SIZE.SMALL}
                                        morePages={false}
                                        fixedHeader={true}
                                        reloading={false}
                                        headCellRender={techObjCardForecastListTableHeadCellRender}
                                        dataCellRender={prms =>
                                            techObjCardForecastListTableDataCellRender({
                                                ...prms,
                                                theme,
                                                onShowForecastDetail: handleShowForecastDetailClick
                                            })
                                        }
                                    />
                                </CardContent>
                            </Card>
                        ) : null}
                    </Stack>
                </DialogContent>
                <DialogActions>
                    {cardData.DNEXT_EQTCHSRV ? (
                        <Button onClick={handleChangeEqTchSrvClick} color={"warning"}>
                            Изменить график ТО
                        </Button>
                    ) : null}
                    <Button onClick={handleMakeEqRpSheetClick} color={"error"}>
                        Ремонтировать
                    </Button>
                    <Button onClick={handleClose}>{BUTTONS.CLOSE}</Button>
                </DialogActions>
            </Dialog>
        </>
    );
};

//Контроль свойств - Карточка технического объекта
TechObjCard.propTypes = {
    cardData: PropTypes.object.isRequired,
    modelsList: PropTypes.object.isRequired,
    forecastHistList: PropTypes.object.isRequired,
    onClose: PropTypes.func,
    onGoToModel: PropTypes.func,
    onGetPrediction: PropTypes.func,
    onChangeEqTchSrv: PropTypes.func,
    onMakeEqRpSheet: PropTypes.func,
    onCardDataRefresh: PropTypes.func
};

//Диалог модификации гарфика ТО и ремонтов
const TechObjChangeEqTchSrv = ({ eQConfig, onOk, onCancel }) => {
    //Подключение к контексту приложения
    const { pOnlineShowDictionary } = useContext(ApplicationСtx);

    //Подключение к контексту взаимодействия с сервером
    const { executeStored } = useContext(BackEndСtx);

    //Подключение к контексту сообщений
    const { showMsgErr } = useContext(MessagingСtx);

    //Собственное состояние - значения формы
    const [values, setValues] = useState({
        eQTchSrv: "",
        eQTchSrvDesc: "",
        planDateFrom: "",
        showEqTchSrv: 0
    });

    //Отработка воода значения в форму
    const handleValueChanged = (name, value) => setValues(pv => ({ ...pv, [name]: value }));

    //Выбор графика ТО и ремонтов
    const selectEquipTechService = async (name, callBack) => {
        const data = await executeStored({ stored: "UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_SELECT_EQTCHSRV", args: { NEQCONFIG: eQConfig } });
        if (data.NIDENT)
            pOnlineShowDictionary({
                unitCode: "EquipTechServices",
                inputParameters: [{ name: "in_Ident", value: data.NIDENT }],
                callBack: res =>
                    callBack(
                        res.success
                            ? [
                                  { name: "eQTchSrv", value: res.outParameters.out_RN },
                                  {
                                      name,
                                      value: `${res.outParameters.out_DOCTYPES_DOCCODE} №${String(res.outParameters.out_PREF).trim()}-${String(
                                          res.outParameters.out_NUMB
                                      ).trim()} от ${formatDateRF(res.outParameters.out_DOCDATE)}`
                                  }
                              ]
                            : null
                    )
            });
        else showMsgErr(TEXTS.NO_DATA_FOUND);
    };

    //Генерация содержимого
    return (
        <Dialog open={true} onClose={() => (onOk ? onCancel() : null)}>
            <DialogTitle>Корректировка графика ТО и ремонтов</DialogTitle>
            <DialogContent>
                <IUDFormTextField
                    elementCode={"eQTchSrvDesc"}
                    elementValue={values.eQTchSrvDesc}
                    labelText={"График ТО"}
                    onChange={handleValueChanged}
                    dictionary={callBack => selectEquipTechService("eQTchSrvDesc", callBack)}
                />
                <IUDFormTextField
                    elementCode={"eQTchSrv"}
                    elementValue={values.eQTchSrv}
                    labelText={"График ТО (идентификатор)"}
                    onChange={handleValueChanged}
                    sx={{ display: "none" }}
                />
                <IUDFormTextField
                    elementCode={"planDateFrom"}
                    elementValue={values.planDateFrom}
                    labelText={"Плановая дата ремонта"}
                    onChange={handleValueChanged}
                    type={"date"}
                />
                <IUDFormTextField
                    elementCode={"showEqTchSrv"}
                    elementValue={values.showEqTchSrv}
                    labelText={"Показать изменённый график"}
                    onChange={handleValueChanged}
                    list={[
                        { name: "Нет", value: 0 },
                        { name: "Да", value: 1 }
                    ]}
                />
            </DialogContent>
            <DialogActions>
                <Button onClick={() => (onOk ? onOk(values) : null)}>{BUTTONS.OK}</Button>
                <Button onClick={() => (onOk ? onCancel() : null)}>{BUTTONS.CANCEL}</Button>
            </DialogActions>
        </Dialog>
    );
};

//Контроль свойств - Диалог модификации гарфика ТО и ремонтов
TechObjChangeEqTchSrv.propTypes = {
    eQConfig: PropTypes.number.isRequired,
    onOk: PropTypes.func,
    onCancel: PropTypes.func
};

//Диалог формирования ремонтной ведомости
const TechObjMakeEqRpSheet = ({ onOk, onCancel }) => {
    //Подключение к контексту приложения
    const { pOnlineShowDictionary } = useContext(ApplicationСtx);

    //Собственное состояние - значения формы
    const [values, setValues] = useState({
        acatalog: "",
        eQTecSrvKind: "",
        planDateFrom: ""
    });

    //Отработка воода значения в форму
    const handleValueChanged = (name, value) => setValues(pv => ({ ...pv, [name]: value }));

    //Выбор каталога размещения ремонтной ведомости
    const selectEquipRepairSheetsCatalog = (name, callBack) => {
        pOnlineShowDictionary({
            unitCode: "EquipRepairSheets",
            showMethod: "catalog",
            callBack: res => callBack(res.success ? [{ name, value: res.outParameters.ctlgname }] : null)
        });
    };

    //Выбор вида технического обслуживания
    const selectEquipTechServiceKinds = (name, callBack) => {
        pOnlineShowDictionary({
            unitCode: "EquipTechServiceKinds",
            callBack: res => callBack(res.success ? [{ name, value: res.outParameters.out_CODE }] : null)
        });
    };

    //Генерация содержимого
    return (
        <Dialog open={true} onClose={() => (onOk ? onCancel() : null)}>
            <DialogTitle>Формирование ремонтной ведомости</DialogTitle>
            <DialogContent>
                <IUDFormTextField
                    elementCode={"acatalog"}
                    elementValue={values.acatalog}
                    labelText={"Каталог размещения"}
                    onChange={handleValueChanged}
                    dictionary={callBack => selectEquipRepairSheetsCatalog("acatalog", callBack)}
                />
                <IUDFormTextField
                    elementCode={"eQTecSrvKind"}
                    elementValue={values.eQTecSrvKind}
                    labelText={"Вид технического обслуживания"}
                    onChange={handleValueChanged}
                    dictionary={callBack => selectEquipTechServiceKinds("eQTecSrvKind", callBack)}
                />
                <IUDFormTextField
                    elementCode={"planDateFrom"}
                    elementValue={values.planDateFrom}
                    labelText={"Плановая дата ремонта"}
                    onChange={handleValueChanged}
                    type={"date"}
                />
            </DialogContent>
            <DialogActions>
                <Button onClick={() => (onOk ? onOk(values) : null)}>{BUTTONS.OK}</Button>
                <Button onClick={() => (onOk ? onCancel() : null)}>{BUTTONS.CANCEL}</Button>
            </DialogActions>
        </Dialog>
    );
};

//Контроль свойств - Диалог формирования ремонтной ведомости
TechObjMakeEqRpSheet.propTypes = {
    onOk: PropTypes.func,
    onCancel: PropTypes.func
};

//Диалог формирования выборки данных для единицы оборудования
const TechObjMakeDataSet = ({ eqobjKind, measureUnit, onOk, onCancel }) => {
    //Подключение к контексту приложения
    const { pOnlineShowDictionary } = useContext(ApplicationСtx);

    //Загрузка списка выборок данных
    const { equipDataSelectionList, equipDataSelectionListIsLoading, equipDataSelectionListAccess } = useEquipDataSelectionList(true);

    //Собственное состояние - активная закладка
    const [selectedTab, setSelectedTab] = useState(0);

    //Собственное состояние - значения формы
    const [values, setValues] = useState({
        dataSet: "",
        eqobjKind: eqobjKind,
        measureUnit: measureUnit || "СУТ",
        userprocsData: "ФормDSОбучМод",
        exsServiceUpload: "Загрузка_на_SCP",
        exsServiceFnUpload: "Загрузка_на_SCP",
        exsServiceSendMd: "Загрузка_на_Фреймворк",
        exsServiceFnSendMd: "Загрузить_на_Фреймворк",
        exsServiceSendMdCb: "Поучение_от_Фреймворка",
        exsServiceFnSendMdCb: "Статус_загрузки_данных_Фреймфорка",
        exsServiceSendRq: "Загрузка_на_Фреймворк",
        exsServiceFnSendRq: "Запрос на обучение",
        exsServiceSendRqCb: "Поучение_от_Фреймворка",
        exsServiceFnSendRqCb: "Статус_обучения_модели",
        exsServiceForecastMd: "Поучение_от_Фреймворка",
        exsServiceFnForecastMd: "Передача_выборки_для_прогноза"
    });

    //Отработка воода значения в форму
    const handleValueChanged = (name, value) => setValues(pv => ({ ...pv, [name]: value }));

    //Обработка смены закладки
    const handleTabChange = (e, newValue) => setSelectedTab(newValue);

    //Генерация содержимого
    return (
        <Dialog open={true} onClose={() => (onOk ? onCancel() : null)} maxWidth={"sm"} fullWidth={true}>
            <DialogTitle>Регистрация выборки данных класса технического объекта</DialogTitle>
            <DialogContent sx={STYLES.TECH_OBJ_MAKE_DATASET_DIALOG_CONTENT}>
                {equipDataSelectionListIsLoading ? null : equipDataSelectionListAccess ? (
                    <>
                        <Box sx={STYLES.EQUIP_DSCM_DIALOG_TABS_CONTAINER}>
                            <Tabs value={selectedTab} onChange={handleTabChange} aria-label="basic tabs example">
                                <Tab label="Основные" />
                                <Tab label="Подготовка" />
                                <Tab label="Передача" />
                                <Tab label="Обучение" />
                                <Tab label="Прогноз" />
                            </Tabs>
                        </Box>
                        <TabPanel value={selectedTab} mode={0}>
                            <IUDFormTextField
                                elementCode={"dataSet"}
                                elementValue={values.dataSet}
                                labelText={"Выборка данных"}
                                onChange={handleValueChanged}
                                list={equipDataSelectionList.filter(item => item.NRN != DS_RN_DEFAULT).map(item => item.SCODE)}
                                freeSolo={true}
                            />
                            <IUDFormTextField
                                elementCode={"eqobjKind"}
                                elementValue={values.eqobjKind}
                                labelText={"Класс оборудования"}
                                onChange={handleValueChanged}
                                disabled
                            />
                            <IUDFormTextField
                                elementCode={"measureUnit"}
                                elementValue={values.measureUnit}
                                labelText={"Едница измерения выборки"}
                                onChange={handleValueChanged}
                                dictionary={callBack => selectMeasureUnit(pOnlineShowDictionary, "measureUnit", callBack)}
                            />
                        </TabPanel>
                        <TabPanel value={selectedTab} mode={1}>
                            <IUDFormTextField
                                elementCode={"userprocsData"}
                                elementValue={values.userprocsData}
                                labelText={"Процедура формирования данных"}
                                onChange={handleValueChanged}
                                dictionary={callBack => selectUserProcsData(pOnlineShowDictionary, "userprocsData", callBack)}
                            />
                            <IUDFormTextField
                                elementCode={"exsServiceUpload"}
                                elementValue={values.exsServiceUpload}
                                labelText={"Сервис обмена для выгрузки данных"}
                                onChange={handleValueChanged}
                                disabled
                            />
                            <IUDFormTextField
                                elementCode={"exsServiceFnUpload"}
                                elementValue={values.exsServiceFnUpload}
                                labelText={"Функция обмена для выгрузки данных"}
                                onChange={handleValueChanged}
                                dictionary={callBack => selectServiceFn(pOnlineShowDictionary, "exsServiceFnUpload", callBack)}
                            />
                        </TabPanel>
                        <TabPanel value={selectedTab} mode={2}>
                            <IUDFormTextField
                                elementCode={"exsServiceSendMd"}
                                elementValue={values.exsServiceSendMd}
                                labelText={"Сервис обмена для передачи внешней системе"}
                                onChange={handleValueChanged}
                                disabled
                            />
                            <IUDFormTextField
                                elementCode={"exsServiceFnSendMd"}
                                elementValue={values.exsServiceFnSendMd}
                                labelText={"Функция обмена для передачи внешней системе"}
                                onChange={handleValueChanged}
                                dictionary={callBack => selectServiceFn(pOnlineShowDictionary, "exsServiceFnSendMd", callBack)}
                            />
                            <IUDFormTextField
                                elementCode={"exsServiceSendMdCb"}
                                elementValue={values.exsServiceSendMdCb}
                                labelText={"Сервис обмена для обратной связи о передаче внешней системе"}
                                onChange={handleValueChanged}
                                disabled
                            />
                            <IUDFormTextField
                                elementCode={"exsServiceFnSendMdCb"}
                                elementValue={values.exsServiceFnSendMdCb}
                                labelText={"Функция обмена для обратной связи о передаче внешней системе"}
                                onChange={handleValueChanged}
                                dictionary={callBack => selectServiceFn(pOnlineShowDictionary, "exsServiceFnSendMdCb", callBack)}
                            />
                        </TabPanel>
                        <TabPanel value={selectedTab} mode={3}>
                            <IUDFormTextField
                                elementCode={"exsServiceSendRq"}
                                elementValue={values.exsServiceSendRq}
                                labelText={"Сервис обмена для обработки внешней системой"}
                                onChange={handleValueChanged}
                                disabled
                            />
                            <IUDFormTextField
                                elementCode={"exsServiceFnSendRq"}
                                elementValue={values.exsServiceFnSendRq}
                                labelText={"Функция обмена для обработки внешней системой"}
                                onChange={handleValueChanged}
                                dictionary={callBack => selectServiceFn(pOnlineShowDictionary, "exsServiceFnSendRq", callBack)}
                            />
                            <IUDFormTextField
                                elementCode={"exsServiceSendRqCb"}
                                elementValue={values.exsServiceSendRqCb}
                                labelText={"Сервис обмена для обратной связи об обработке внешней системой"}
                                onChange={handleValueChanged}
                                disabled
                            />
                            <IUDFormTextField
                                elementCode={"exsServiceFnSendRqCb"}
                                elementValue={values.exsServiceFnSendRqCb}
                                labelText={"Функция обмена для обратной связи об обработке внешней системой"}
                                onChange={handleValueChanged}
                                dictionary={callBack => selectServiceFn(pOnlineShowDictionary, "exsServiceFnSendRqCb", callBack)}
                            />
                        </TabPanel>
                        <TabPanel value={selectedTab} mode={4}>
                            <IUDFormTextField
                                elementCode={"exsServiceForecastMd"}
                                elementValue={values.exsServiceForecastMd}
                                labelText={"Сервис обмена для публикации данных наработки оборудования"}
                                onChange={handleValueChanged}
                                disabled
                            />
                            <IUDFormTextField
                                elementCode={"exsServiceFnForecastMd"}
                                elementValue={values.exsServiceFnForecastMd}
                                labelText={"Функция обмена для публикации данных наработки оборудования"}
                                onChange={handleValueChanged}
                                dictionary={callBack => selectServiceFn(pOnlineShowDictionary, "exsServiceFnForecastMd", callBack)}
                            />
                        </TabPanel>
                    </>
                ) : (
                    <P8PAppInlineError text="У вас нет прав доступа для обучения моделей. Обратитесь к администратору." />
                )}
            </DialogContent>
            <DialogActions>
                {equipDataSelectionListAccess ? <Button onClick={() => (onOk ? onOk(values) : null)}>{BUTTONS.OK}</Button> : null}
                <Button onClick={() => (onOk ? onCancel() : null)}>{BUTTONS.CANCEL}</Button>
            </DialogActions>
        </Dialog>
    );
};

//Контроль свойств - Диалог формирования выборки данных для единицы оборудования
TechObjMakeDataSet.propTypes = {
    eqobjKind: PropTypes.string.isRequired,
    measureUnit: PropTypes.string,
    onOk: PropTypes.func,
    onCancel: PropTypes.func
};

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

export {
    eqConfigTechObjTableValueFormatter,
    eqConfigTechObjTableDataCellRender,
    TechObjCard,
    TechObjChangeEqTchSrv,
    TechObjMakeEqRpSheet,
    TechObjMakeDataSet
};
