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

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

import React, { useState, useContext, useRef, useEffect } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import {
    Box,
    Stack,
    FormControl,
    InputLabel,
    Select,
    MenuItem,
    List,
    ListItem,
    ListItemButton,
    ListItemText,
    Card,
    CardContent,
    Typography,
    Button,
    Dialog,
    DialogTitle,
    DialogContent,
    DialogActions,
    IconButton,
    Icon,
    Popper,
    ButtonGroup,
    ClickAwayListener,
    Paper,
    MenuList,
    Tabs,
    Tab
} from "@mui/material"; //Интерфейсные компоненты
import { useTheme } from "@mui/material/styles"; //Темы оформления
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы и константы
import {
    APP_BAR_HEIGHT,
    TABS_HEIGHT,
    SCROLL_STYLES,
    formatModelStateValue,
    selectEqobjKind,
    selectMeasureUnit,
    selectUserProcsData,
    selectServiceFn,
    IUDFormTextField,
    TabPanel
} from "./eqs_tech_cond_forecast_layout"; //Общие вспомогательные компоненты и вёрстка
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
import { DS_RN_DEFAULT, TASK_LIST } from "./eqs_tech_cond_forecast_hooks"; //Общие вспомогательные хуки
import { useEquipDataSelectionClassMachineDataSetsList, useEquipDataSelectionClassMachineCard } from "./admin_tab_hooks"; //Вспомогательные хуки

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

//Высота списка выборок данных
const DS_SELECTOR_HEIGHT = "80px";

//Высота кнопки добавления технического объекта
const CM_ADD_BTN_HEIGHT = "46.5px";

//Структура элемента списка выборок данных оборудования
const EQUIP_DATA_SELECTION_LIST = PropTypes.shape({
    NRN: PropTypes.number.isRequired,
    SNAME: PropTypes.string.isRequired
});

//Структура элемента списка классов оборудования выборки данных
const EQUIP_DATA_SELECTION_CLASS_MACHINE_LIST = PropTypes.shape({
    NRN: PropTypes.number.isRequired,
    SCODE: PropTypes.string.isRequired,
    SNAME: PropTypes.string.isRequired
});

//Стили
const STYLES = {
    EQUIP_DS_LIST_FORM_CONTROL: { minWidth: "300px" },
    EQUIP_DSCM_LIST: {
        minHeight: `calc(100vh - ${APP_BAR_HEIGHT} - ${TABS_HEIGHT} - ${DS_SELECTOR_HEIGHT} - ${CM_ADD_BTN_HEIGHT})`,
        maxHeight: `calc(100vh - ${APP_BAR_HEIGHT} - ${TABS_HEIGHT} - ${DS_SELECTOR_HEIGHT} - ${CM_ADD_BTN_HEIGHT})`,
        overflowX: "hidden",
        overflowY: "scroll",
        paddingLeft: "15px",
        paddingRight: "15px",
        ...SCROLL_STYLES
    },
    EQUIP_DSCM_LIST_ITEM_SECONDARY_TEXT: { display: "block", wordBreak: "break-all" },
    EQUIP_DSCM_CARD: {
        minHeight: `calc(100vh - ${APP_BAR_HEIGHT} - ${TABS_HEIGHT} - ${DS_SELECTOR_HEIGHT})`,
        maxHeight: `calc(100vh - ${APP_BAR_HEIGHT} - ${TABS_HEIGHT} - ${DS_SELECTOR_HEIGHT})`,
        overflowY: "auto",
        ...SCROLL_STYLES
    },
    EQUIP_DSCM_DIALOG_CONTENT: { minHeight: "40vh", maxHeight: "40vh", ...SCROLL_STYLES },
    EQUIP_DSCM_DIALOG_TABS_CONTAINER: { borderBottom: 1, borderColor: "divider" },
    FL_ML_TABLE: {
        height: `200px`,
        ...SCROLL_STYLES
    },
    EXTRA_CAPTION_BUTTON_CONTAINER: (theme, maxWidth) => ({
        borderWidth: "1px",
        borderStyle: "solid",
        borderColor: theme.palette.grey[400],
        maxWidth,
        borderRadius: theme.shape.borderRadius,
        paddingLeft: "10px",
        paddingRight: "10px",
        paddingTop: "2px",
        paddingBottom: "2px"
    }),
    EXTRA_CAPTION_BUTTON_TITLE: { whiteSpace: "nowrap", textOverflow: "ellipsis", overflow: "hidden" }
};

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

//Формирование значения для колонки "Состояние" файла класса оборудования выборки данных
const formatFileStateValue = (theme, value, err) => {
    const [text, icon, color] =
        value == 0
            ? ["Зарегистрирован", "app_registration", null]
            : value == 1
            ? ["Загружается на сервер", "file_upload", theme.palette.warning.main]
            : value == 2
            ? ["Успешно загружен на сервер", "dns", theme.palette.primary.main]
            : value == 3
            ? [`Ошибка загрузки на сервер: ${err}`, "error", theme.palette.error.main]
            : value == 4
            ? ["Загружается во внешнюю систему", "cloud_upload", theme.palette.warning.main]
            : value == 5
            ? ["Успешно передан внешней системе", "cloud_done", theme.palette.success.main]
            : [`Ошибка передачи внешней системе: ${err}`, "error", theme.palette.error.main];
    return (
        <Stack direction="row" gap={0.5} alignItems="center" justifyContent="left" color={color}>
            <Icon title={text}>{icon}</Icon>
            {text}
        </Stack>
    );
};

//Форматирование колонок таблицы файлов класса оборудования выборки данных
const filesListDataCellRender = ({ row, columnDef, theme, onDelete }) => {
    switch (columnDef.name) {
        case "SDESCR":
            return { data: <div dangerouslySetInnerHTML={{ __html: row.SDESCR }}></div> };
        case "NSTATUS":
            return {
                cellProps: { align: "left" },
                data: formatFileStateValue(theme, row.NSTATUS, row.SERR)
            };
        case "SACTIONS":
            return {
                data: (
                    <Stack spacing={1} direction={"row"} alignItems={"center"}>
                        <IconButton onClick={() => (onDelete ? onDelete(row.NRN) : null)}>
                            <Icon>delete</Icon>
                        </IconButton>
                    </Stack>
                )
            };
    }
};

//Форматирование колонок таблицы моделей класса оборудования выборки данных
const modelsListDataCellRender = ({ row, columnDef, theme, onDelete, onSendRq }) => {
    switch (columnDef.name) {
        case "NPRECISION":
            return {
                data: row.NSTATUS == 2 ? `${row.NPRECISION} ${row.SDICMUNTS}` : ""
            };
        case "NSTATUS":
            return {
                cellProps: { align: "left" },
                data: formatModelStateValue(theme, row.NSTATUS, row.SERR)
            };
        case "SACTIONS":
            return {
                data: (
                    <Stack spacing={1} direction={"row"} alignItems={"center"}>
                        <IconButton onClick={() => (onDelete ? onDelete(row.NRN) : null)}>
                            <Icon>delete</Icon>
                        </IconButton>
                        {row.NSTATUS == 0 ? <Button onClick={() => (onSendRq ? onSendRq(row.NRN) : null)}>Обучить</Button> : null}
                    </Stack>
                )
            };
    }
};

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

//Кнопка с всплывающим меню опций
const PopUpButton = ({ onClick, options = [], zIndex = 10000 }) => {
    //Собственное состояние - выбранная опция
    const [selectedOption, setSelectedOption] = useState(0);

    //Собственное состояние - флаг открытия списка опций
    const [open, setOpen] = useState(false);

    //Ссылка на группу кнопок для аттача всплывающего меню
    const anchorRef = useRef(null);

    //Отработка нажатия на кнопку
    const handleClick = () => (onClick && options[selectedOption] ? onClick(options[selectedOption]) : null);

    //Отработка открытия/закрытия меню опций
    const handleToggle = () => {
        setOpen(prevOpen => !prevOpen);
    };

    //Принудительное закрытие меню опций (с проверкой открытости)
    const handleClose = event => {
        if (anchorRef.current && anchorRef.current.contains(event.target)) return;
        setOpen(false);
    };

    //Отработка нажатия на элемент меню опций
    const handleMenuItemClick = index => {
        setSelectedOption(index);
        setOpen(false);
    };

    //Генерация содержимого
    return Array.isArray(options) && options.length > 0 ? (
        <>
            <ButtonGroup ref={anchorRef} variant="text">
                <Button onClick={handleClick}>{options[selectedOption]?.label || ""}</Button>
                <Button size="small" onClick={handleToggle}>
                    <Icon>arrow_drop_down</Icon>
                </Button>
            </ButtonGroup>
            <Popper open={open} anchorEl={anchorRef.current} sx={{ zIndex }}>
                <ClickAwayListener onClickAway={handleClose}>
                    <Paper>
                        <MenuList autoFocusItem>
                            {options.map((o, index) => (
                                <MenuItem key={o.code} selected={index === selectedOption} onClick={() => handleMenuItemClick(index)}>
                                    {o.label}
                                </MenuItem>
                            ))}
                        </MenuList>
                    </Paper>
                </ClickAwayListener>
            </Popper>
        </>
    ) : null;
};

//Контроль свойств - Кнопка с всплывающим меню опций
PopUpButton.propTypes = {
    onClick: PropTypes.func,
    options: PropTypes.arrayOf(
        PropTypes.shape({
            code: PropTypes.string.isRequired,
            label: PropTypes.string.isRequired
        })
    ),
    zIndex: PropTypes.number
};

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

//Диалог IU выборки данных
const EquipDataSelectionIU = ({ onOk, onCancel }) => {
    //Собственное состояние - значения формы
    const [values, setValues] = useState({ code: "", name: "" });

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

    //Генерация содержимого
    return (
        <Dialog open={true} onClose={() => (onOk ? onCancel() : null)}>
            <DialogTitle>Выборка данных</DialogTitle>
            <DialogContent>
                <IUDFormTextField elementCode={"code"} elementValue={values.code} labelText={"Мнемокод"} onChange={handleValueChanged} />
                <IUDFormTextField elementCode={"name"} elementValue={values.name} labelText={"Наименование"} onChange={handleValueChanged} />
            </DialogContent>
            <DialogActions>
                <Button onClick={() => (onOk ? onOk(values) : null)}>{BUTTONS.OK}</Button>
                <Button onClick={() => (onOk ? onCancel() : null)}>{BUTTONS.CANCEL}</Button>
            </DialogActions>
        </Dialog>
    );
};

//Контроль свойств - Диалог IU выборки данных
EquipDataSelectionIU.propTypes = {
    onOk: PropTypes.func,
    onCancel: PropTypes.func
};

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

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

    //Собственное состояние - значения формы
    const [values, setValues] = useState({
        eqobjKind: "",
        measureUnit: "",
        userprocsData: "",
        exsServiceUpload: "",
        exsServiceFnUpload: "",
        exsServiceSendMd: "",
        exsServiceFnSendMd: "",
        exsServiceSendMdCb: "",
        exsServiceFnSendMdCb: "",
        exsServiceSendRq: "",
        exsServiceFnSendRq: "",
        exsServiceSendRqCb: "",
        exsServiceFnSendRqCb: "",
        exsServiceForecastMd: "",
        exsServiceFnForecastMd: ""
    });

    //Карточка из базы
    const { equipDataSelectionClassMachineCard } = useEquipDataSelectionClassMachineCard(classMachine, 0);

    //При загрузке карточки из базы
    useEffect(() => {
        if (equipDataSelectionClassMachineCard.NRN)
            setValues({
                eqobjKind: equipDataSelectionClassMachineCard.SSEQOBJKIND,
                measureUnit: equipDataSelectionClassMachineCard.SDICMUNTS,
                userprocsData: equipDataSelectionClassMachineCard.SUSERPROCS_DATA,
                exsServiceUpload: equipDataSelectionClassMachineCard.SEXSSERVICE_UPLOAD,
                exsServiceFnUpload: equipDataSelectionClassMachineCard.SEXSSERVICEFN_UPLOAD,
                exsServiceSendMd: equipDataSelectionClassMachineCard.SEXSSERVICE_SEND_MD,
                exsServiceFnSendMd: equipDataSelectionClassMachineCard.SEXSSERVICEFN_SEND_MD,
                exsServiceSendMdCb: equipDataSelectionClassMachineCard.SEXSSERVICE_SEND_MDCB,
                exsServiceFnSendMdCb: equipDataSelectionClassMachineCard.SEXSSERVICEFN_SEND_MDCB,
                exsServiceSendRq: equipDataSelectionClassMachineCard.SEXSSERVICE_SEND_RQ,
                exsServiceFnSendRq: equipDataSelectionClassMachineCard.SEXSSERVICEFN_SEND_RQ,
                exsServiceSendRqCb: equipDataSelectionClassMachineCard.SEXSSERVICE_SEND_RQCB,
                exsServiceFnSendRqCb: equipDataSelectionClassMachineCard.SEXSSERVICEFN_SEND_RQCB,
                exsServiceForecastMd: equipDataSelectionClassMachineCard.SEXSSERVICE_FRCST_MD,
                exsServiceFnForecastMd: equipDataSelectionClassMachineCard.SEXSSERVICEFN_FRCST_MD
            });
    }, [equipDataSelectionClassMachineCard]);

    //Отработка воода значения в форму
    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.EQUIP_DSCM_DIALOG_CONTENT}>
                <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={"eqobjKind"}
                        elementValue={values.eqobjKind}
                        labelText={"Класс оборудования"}
                        onChange={handleValueChanged}
                        dictionary={callBack => selectEqobjKind(pOnlineShowDictionary, "eqobjKind", callBack)}
                    />
                    <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>
            </DialogContent>
            <DialogActions>
                <Button onClick={() => (onOk ? onOk(values) : null)}>{BUTTONS.OK}</Button>
                <Button onClick={() => (onOk ? onCancel() : null)}>{BUTTONS.CANCEL}</Button>
            </DialogActions>
        </Dialog>
    );
};

//Контроль свойств - Диалог IU класса оборудования выборки данных
EquipDataSelectionClassMachineIU.propTypes = {
    classMachine: PropTypes.number,
    onOk: PropTypes.func,
    onCancel: PropTypes.func
};

//Диалог параметров передачи файлов данных класса оборудования фреймворку
const EquipDataSelectionClassMachineFileSendMDDialog = ({ classMachine, onOk, onCancel }) => {
    //Собственное состояние - значения формы
    const [values, setValues] = useState({
        dataset: null
    });

    //Доступные выборки данных
    const { equipDataSelectionClassMachineDataSetsList } = useEquipDataSelectionClassMachineDataSetsList(classMachine, 2);

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

    //Генерация содержимого
    return (
        <Dialog open={true} onClose={() => (onOk ? onCancel() : null)}>
            <DialogTitle>Передать фреймворку</DialogTitle>
            <DialogContent>
                <IUDFormTextField
                    elementCode={"dataset"}
                    elementValue={values.dataset}
                    labelText={"Выборка"}
                    onChange={handleValueChanged}
                    list={equipDataSelectionClassMachineDataSetsList}
                />
            </DialogContent>
            <DialogActions>
                <Button onClick={() => (onOk ? onOk(values) : null)}>{BUTTONS.OK}</Button>
                <Button onClick={() => (onOk ? onCancel() : null)}>{BUTTONS.CANCEL}</Button>
            </DialogActions>
        </Dialog>
    );
};

//Контроль свойств - Диалог параметров передачи файлов данных класса оборудования фреймворку
EquipDataSelectionClassMachineFileSendMDDialog.propTypes = {
    classMachine: PropTypes.number.isRequired,
    onOk: PropTypes.func,
    onCancel: PropTypes.func
};

//Диалог IU модели класса оборудования выборки данных
const EquipDataSelectionClassMachineModelIU = ({ classMachine, onOk, onCancel }) => {
    //Собственное состояние - значения формы
    const [values, setValues] = useState({
        task: "RUL",
        dataset: null,
        userprocsForecastData: null
    });

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

    //Доступные выборки данных
    const { equipDataSelectionClassMachineDataSetsList } = useEquipDataSelectionClassMachineDataSetsList(classMachine);

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

    //Генерация содержимого
    return (
        <Dialog open={true} onClose={() => (onOk ? onCancel() : null)}>
            <DialogTitle>Модель класса оборудования выборки данных</DialogTitle>
            <DialogContent>
                <IUDFormTextField
                    elementCode={"task"}
                    elementValue={values.task}
                    labelText={"Задача"}
                    onChange={handleValueChanged}
                    list={TASK_LIST}
                />
                <IUDFormTextField
                    elementCode={"dataset"}
                    elementValue={values.dataset}
                    labelText={"Выборка"}
                    onChange={handleValueChanged}
                    list={equipDataSelectionClassMachineDataSetsList}
                />
                <IUDFormTextField
                    elementCode={"userprocsForecastData"}
                    elementValue={values.userprocsForecastData}
                    labelText={"Процедура формирования данных для прогноза"}
                    onChange={handleValueChanged}
                    dictionary={callBack => selectUserProcsData(pOnlineShowDictionary, "userprocsForecastData", callBack)}
                />
            </DialogContent>
            <DialogActions>
                <Button onClick={() => (onOk ? onOk(values) : null)}>{BUTTONS.OK}</Button>
                <Button onClick={() => (onOk ? onCancel() : null)}>{BUTTONS.CANCEL}</Button>
            </DialogActions>
        </Dialog>
    );
};

//Контроль свойств - Диалог IU модели класса оборудования выборки данных
EquipDataSelectionClassMachineModelIU.propTypes = {
    classMachine: PropTypes.number.isRequired,
    onOk: PropTypes.func,
    onCancel: PropTypes.func
};

//Список выборок данных оборудования
const EquipDataSelectionList = ({ list, value, onChange }) => {
    //При выборе элемента
    const handleChange = e => (onChange ? onChange(e.target.value) : null);

    //Генерация содержимого
    return (
        <FormControl variant="standard" sx={STYLES.EQUIP_DS_LIST_FORM_CONTROL}>
            <InputLabel id="equipDSlabel">Выборка данных оборудования</InputLabel>
            <Select
                labelId="equipDSlabel"
                id="equipDS"
                label="Выборка данных оборудования"
                value={list.find(i => i.NRN == value) ? value : DS_RN_DEFAULT}
                onChange={handleChange}
                displayEmpty
            >
                {list.map((item, i) => (
                    <MenuItem key={i} value={item.NRN}>
                        {item.SNAME}
                    </MenuItem>
                ))}
            </Select>
        </FormControl>
    );
};

//Контроль свойств - Список выборок данных оборудования
EquipDataSelectionList.propTypes = {
    list: PropTypes.arrayOf(EQUIP_DATA_SELECTION_LIST).isRequired,
    value: PropTypes.number.isRequired,
    onChange: PropTypes.func
};

//Список классов оборудования выборки данных
const EquipDataSelectionClassMachineList = ({ list, value, onClick }) => {
    //При щелчке на элементе
    const handleClick = id => (onClick ? onClick(id) : null);

    //Генерация содержимого
    return (
        <List sx={STYLES.EQUIP_DSCM_LIST}>
            {list.map((item, i) => (
                <ListItem disablePadding key={i}>
                    <ListItemButton selected={value == item.NRN} onClick={() => handleClick(item.NRN)}>
                        <ListItemText
                            primary={
                                <>
                                    <b>{item.SCODE}</b> - <Typography component="span">{item.SNAME}</Typography>
                                </>
                            }
                            secondary={
                                <Typography
                                    component="span"
                                    variant="caption"
                                    color={"text.secondary"}
                                    sx={STYLES.EQUIP_DSCM_LIST_ITEM_SECONDARY_TEXT}
                                >
                                    (<b>ЕИ:</b> {item.SDICMUNTS}; <b>ПФ:</b> {item.SUSERPROCS_DATA}; <b>Обмен:</b> {item.SEXSSERVICEFN_UPLOAD},{" "}
                                    {item.SEXSSERVICEFN_SEND_MD}, {item.SEXSSERVICEFN_SEND_RQ})
                                </Typography>
                            }
                        />
                    </ListItemButton>
                </ListItem>
            ))}
        </List>
    );
};

//Контроль свойств - Список классов оборудования выборки данных
EquipDataSelectionClassMachineList.propTypes = {
    list: PropTypes.arrayOf(EQUIP_DATA_SELECTION_CLASS_MACHINE_LIST).isRequired,
    value: PropTypes.number,
    onClick: PropTypes.func
};

//Карточка класса оборудования выборки данных
const EquipDataSelectionClassMachineCard = ({
    card,
    filesList,
    modelsList,
    onCardEdit,
    onCardDelete,
    onClassMachineFilesRefresh,
    onClassMachineFilesMake,
    onClassMachineFilesDelete,
    onClassMachineFilesUpload,
    onClassMachineFilesSendMd,
    onClassMachineModelRefresh,
    onClassMachineModelAdd,
    onClassMachineModelDelete,
    onClassMachineModelSendRq
}) => {
    //Подключаемся к теме
    const theme = useTheme();

    //При нажатии на "Исправить" для карточки
    const handleCardEditClick = () => (onCardEdit ? onCardEdit(card.NRN) : null);

    //При нажатии на "Удалить" для карточки
    const handleCardDeleteClick = () => (onCardDelete ? onCardDelete(card.NRN) : null);

    //При нажатии на "Обновить" для файлов данных
    const handleClassMachineFilesRefreshClick = () => (onClassMachineFilesRefresh ? onClassMachineFilesRefresh() : null);

    //При нажатии на "Сформировать" для файлов данных
    const handleClassMachineFilesMakeClick = option =>
        onClassMachineFilesMake ? onClassMachineFilesMake(card.NRN, card.SUSERPROCS_DATA, option.code === "CLEAR_AND_MAKE" ? 1 : 0) : null;

    //При нажатии на "Загрузить на сервер" для файлов данных
    const handleClassMachineFilesUploadClick = () => (onClassMachineFilesUpload ? onClassMachineFilesUpload(card.NRN) : null);

    //При нажатии на "Загрузить на сервер" для файлов данных
    const handleClassMachineFilesSendMdClick = () => (onClassMachineFilesSendMd ? onClassMachineFilesSendMd(card.NRN) : null);

    //При нажатии на "Удалить" для файлов данных
    const handleClassMachineFilesDeleteClick = equipDSCMFL => (onClassMachineFilesDelete ? onClassMachineFilesDelete(equipDSCMFL) : null);

    //При нажатии на "Обновить" для моделей
    const handleClassMachineModelRefreshClick = () => (onClassMachineModelRefresh ? onClassMachineModelRefresh() : null);

    //При нажатии на "Добавить" для моделей
    const handleClassMachineModelAddClick = () => (onClassMachineModelAdd ? onClassMachineModelAdd() : null);

    //При нажатии на "Удалить" для моделей
    const handleClassMachineModelDeleteClick = equipDSCMML => (onClassMachineModelDelete ? onClassMachineModelDelete(equipDSCMML) : null);

    //При нажатии на "Обучить" для моделей
    const handleClassMachineModelSendRqClick = equipDSCMML => (onClassMachineModelSendRq ? onClassMachineModelSendRq(equipDSCMML) : null);

    //Генерация содержимого
    return (
        <Box p={2} sx={STYLES.EQUIP_DSCM_CARD}>
            {card.NRN ? (
                <Stack spacing={2}>
                    <Stack spacing={2} direction={"row"} alignItems={"center"}>
                        <Typography variant="h5" component="div">
                            {card.SNAME}
                        </Typography>
                        <IconButton onClick={handleCardEditClick}>
                            <Icon>edit</Icon>
                        </IconButton>
                        <IconButton onClick={handleCardDeleteClick}>
                            <Icon>delete</Icon>
                        </IconButton>
                    </Stack>
                    <Card elevation={6}>
                        <CardContent>
                            <Stack spacing={2} direction={"row"} alignItems={"center"}>
                                <Typography variant="h6" component="div">
                                    Файлы данных
                                </Typography>
                                <Stack spacing={0} direction={"row"}>
                                    <IconButton onClick={handleClassMachineFilesRefreshClick}>
                                        <Icon>refresh</Icon>
                                    </IconButton>
                                    <PopUpButton
                                        onClick={handleClassMachineFilesMakeClick}
                                        options={[
                                            { code: "MAKE", label: "Сформировать" },
                                            { code: "CLEAR_AND_MAKE", label: "Переформировать" }
                                        ]}
                                    />
                                    <Button onClick={handleClassMachineFilesUploadClick}>Загрузить на сервер</Button>
                                    <Button onClick={handleClassMachineFilesSendMdClick}>Передать фреймворку</Button>
                                </Stack>
                            </Stack>
                            <P8PDataGrid
                                {...{ ...P8P_DATA_GRID_CONFIG_PROPS }}
                                containerComponentProps={{ sx: STYLES.FL_ML_TABLE, elevation: 0 }}
                                columnsDef={filesList.columnsDef}
                                rows={filesList.rows}
                                size={P8P_DATA_GRID_SIZE.SMALL}
                                morePages={false}
                                fixedHeader={true}
                                reloading={false}
                                headCellRender={classMachineCardTableHeadCellRender}
                                dataCellRender={prms => filesListDataCellRender({ ...prms, theme, onDelete: handleClassMachineFilesDeleteClick })}
                            />
                        </CardContent>
                    </Card>
                    <Card elevation={6}>
                        <CardContent>
                            <Stack spacing={2} direction={"row"} alignItems={"center"}>
                                <Typography variant="h6" component="div">
                                    Модели
                                </Typography>
                                <Stack spacing={0} direction={"row"}>
                                    <IconButton onClick={handleClassMachineModelRefreshClick}>
                                        <Icon>refresh</Icon>
                                    </IconButton>
                                    <IconButton onClick={handleClassMachineModelAddClick}>
                                        <Icon>add</Icon>
                                    </IconButton>
                                </Stack>
                            </Stack>
                            <P8PDataGrid
                                {...{ ...P8P_DATA_GRID_CONFIG_PROPS }}
                                containerComponentProps={{ sx: STYLES.FL_ML_TABLE, elevation: 0 }}
                                columnsDef={modelsList.columnsDef}
                                rows={modelsList.rows}
                                size={P8P_DATA_GRID_SIZE.SMALL}
                                morePages={false}
                                fixedHeader={true}
                                reloading={false}
                                headCellRender={classMachineCardTableHeadCellRender}
                                dataCellRender={prms =>
                                    modelsListDataCellRender({
                                        ...prms,
                                        theme,
                                        onDelete: handleClassMachineModelDeleteClick,
                                        onSendRq: handleClassMachineModelSendRqClick
                                    })
                                }
                            />
                        </CardContent>
                    </Card>
                </Stack>
            ) : null}
        </Box>
    );
};

//Контроль свойств - Карточка класса оборудования выборки данных
EquipDataSelectionClassMachineCard.propTypes = {
    card: PropTypes.object.isRequired,
    filesList: PropTypes.object.isRequired,
    modelsList: PropTypes.object.isRequired,
    onCardEdit: PropTypes.func,
    onCardDelete: PropTypes.func,
    onClassMachineFilesRefresh: PropTypes.func,
    onClassMachineFilesMake: PropTypes.func,
    onClassMachineFilesDelete: PropTypes.func,
    onClassMachineFilesUpload: PropTypes.func,
    onClassMachineFilesSendMd: PropTypes.func,
    onClassMachineModelRefresh: PropTypes.func,
    onClassMachineModelAdd: PropTypes.func,
    onClassMachineModelDelete: PropTypes.func,
    onClassMachineModelSendRq: PropTypes.func
};

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

export {
    EquipDataSelectionIU,
    EquipDataSelectionClassMachineIU,
    EquipDataSelectionClassMachineFileSendMDDialog,
    EquipDataSelectionClassMachineModelIU,
    EquipDataSelectionList,
    EquipDataSelectionClassMachineList,
    EquipDataSelectionClassMachineCard
};
