/*
    Парус 8 - Панели мониторинга - ПУП - Производственный план цеха
    Панель мониторинга: Корневая панель производственного плана цеха
*/

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

import React, { useContext, useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Drawer, Fab, Box, List, ListItemButton, ListItemText, Typography, TextField, Link, Grid } from "@mui/material"; //Интерфейсные элементы
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
import { useDeptCostProdPlans, useFilteredPlans } from "./hooks"; //Вспомогательные хуки
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { IncomFromDepsDataGridDialog } from "./incomefromdeps"; //Диалог сдачи продукции
import { CostRouteListsDataGridDialog } from "./fcroutlst"; //Диалог маршрутных листов

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

//Высота заголовка
const TITLE_HEIGHT = "35px";

//Верхний отступ заголовка
const TITLE_PADDING_TOP = "10px";

//Нижний отступ заголовка
const TITLE_PADDING_BOTTOM = "20px";

//Стили
const STYLES = {
    PLANS_FINDER: { marginTop: "10px", marginLeft: "10px", width: "93%" },
    PLANS_LIST_ITEM_PRIMARY: { wordWrap: "break-word" },
    PLANS_BUTTON: { position: "absolute" },
    PLANS_DRAWER: {
        width: "350px",
        display: "inline-block",
        flexShrink: 0,
        [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box", ...APP_STYLES.SCROLL }
    },
    CONTAINER: { textAlign: "center" },
    TITLE: { height: TITLE_HEIGHT, overflow: "hidden", paddingTop: TITLE_PADDING_TOP, paddingBottom: TITLE_PADDING_BOTTOM, display: "inline-table" },
    DATA_GRID_CONTAINER: {
        height: `calc(100vh - ${APP_BAR_HEIGHT} - ${TITLE_HEIGHT} - ${TITLE_PADDING_TOP} - ${TITLE_PADDING_BOTTOM} - 29px)`,
        width: "98vw",
        ...APP_STYLES.SCROLL
    },
    DATA_GRID_GROUP_CELL: { padding: "2px" },
    DATA_GRID_CELL: { padding: "8px", maxWidth: "300px", textOverflow: "ellipsis", overflow: "hidden", whiteSpace: "pre" },
    DATA_GRID_CELL_STATUS: (currentStyle, row) => ({ backgroundColor: getRowBackgroudColor(row), ...currentStyle }),
    DATA_GRID_CELL_PLAN_FACT: currentStyle => ({ ...currentStyle, backgroundColor: "lightgrey" }),
    DATA_GRID_CELL_MATRES_CODE: (currentStyle, row) => ({ backgroundColor: getRowBackgroudColor(row), ...currentStyle }),
    PLAN_FACT_VALUE: { textAlign: "center", display: "flex", justifyContent: "center" },
    PLAN_FACT_DELIMITER: { padding: "0px 5px" },
    FACT_VALUE: { color: "blue" }
};

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

//Генерация представления ячейки заголовка группы
export const groupCellRender = ({ group }) => ({
    cellStyle: STYLES.DATA_GRID_GROUP_CELL,
    data: group.caption
});

//Вычисление цвета заливки для строки
const getRowBackgroudColor = row => {
    //Факт === План
    if (row["NMAIN_QUANT"] === row["NREL_FACT"]) return "lightgreen";
    //План <= (Факт + Запущено)
    if (row["NMAIN_QUANT"] <= row["NREL_FACT"] + row["NFCROUTLST_QUANT"]) return "lightblue";
    //Сумма "Количество план" = 0 или < "План"
    if (row["NSUM_PLAN"] === 0 || (row["NSUM_PLAN"] !== 0 && row["NSUM_PLAN"] < row["NMAIN_QUANT"])) {
        //"Факт" >= "План"
        if (row["NREL_FACT"] >= row["NMAIN_QUANT"]) return "#F0E68C";
    } else {
        //Сумма "Количество факт" >= сумма "Количество план"
        if (row["NSUM_FACT"] >= row["NSUM_PLAN"]) return "#F0E68C";
    }
    return "lightcoral";
};

//Генерация заливки строки исходя от значений
const dataCellRender = ({ row, columnDef, handleProdOrderClick, handleMatresCodeClick }) => {
    //Описываем общие свойства
    let cellProps = { title: row[columnDef.name] };
    //Описываем общий стиль
    let cellStyle = STYLES.DATA_GRID_CELL;
    //Для колонки "Статус"
    if (columnDef.name === "SSTATUS") return { cellProps, cellStyle: STYLES.DATA_GRID_CELL_STATUS(cellStyle, row), data: row[columnDef] };
    //Для колонки даты
    if (columnDef.name.indexOf("PLAN_FACT") >= 0) {
        //Получаем текущий день
        let curDay = new Date().getDate().toString().padStart(2, "0");
        //Формируем regex для проверки
        let regex = new RegExp(`N_${curDay}.*`, "g");
        //Если это значение текущего дня
        if (columnDef.name.match(regex)) cellStyle = STYLES.DATA_GRID_CELL_PLAN_FACT(cellStyle);
        //Если в колонке есть значение
        if (row[columnDef.name]) {
            //Разбиваем его на план/факт
            let values = row[columnDef.name].split("/");
            //Разбиваем значения на блоки
            return {
                cellProps,
                cellStyle,
                data: (
                    <Box sx={STYLES.PLAN_FACT_VALUE}>
                        <Box>{values[0]}</Box>
                        <Box sx={STYLES.PLAN_FACT_DELIMITER}>/</Box>
                        <Box sx={STYLES.FACT_VALUE}>{values[1]}</Box>
                    </Box>
                )
            };
        } else return { cellProps, cellStyle, data: row[columnDef] };
    }
    //Для колонки "Заказ"
    if (columnDef.name === "SPROD_ORDER") {
        return {
            cellProps,
            cellStyle,
            data: (
                <Link component="button" variant="body2" align="left" underline="hover" onClick={() => handleProdOrderClick(row["NRN"])}>
                    {row[columnDef.name]}
                </Link>
            )
        };
    }
    //Для колонки "Обозначение"
    if (columnDef.name === "SMATRES_CODE")
        return {
            cellProps,
            cellStyle: STYLES.DATA_GRID_CELL_MATRES_CODE(cellStyle, row),
            data: (
                <Link component="button" variant="body2" align="left" underline="hover" onClick={() => handleMatresCodeClick(row["NRN"])}>
                    {row[columnDef.name]}
                </Link>
            )
        };
    //Для всех остальных
    return { cellProps, cellStyle, data: row[columnDef] };
};

//Список каталогов планов
const PlanList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = {}) => {
    //Генерация содержимого
    return (
        <div>
            <TextField
                sx={STYLES.PLANS_FINDER}
                name="planFilter"
                label="План"
                value={filter.planName}
                variant="standard"
                fullWidth
                onChange={event => {
                    setFilter(pv => ({ ...pv, planName: event.target.value }));
                }}
            ></TextField>
            <List>
                {plans.map(p => (
                    <ListItemButton key={p.NRN} selected={p.NRN === selectedPlan.NRN} onClick={() => (onClick ? onClick(p) : null)}>
                        <ListItemText primary={<Typography sx={STYLES.PLANS_LIST_ITEM_PRIMARY}>{p.SDOC_INFO}</Typography>} />
                    </ListItemButton>
                ))}
            </List>
        </div>
    );
};

//Контроль свойств - Список каталогов планов
PlanList.propTypes = {
    plans: PropTypes.array,
    selectedPlan: PropTypes.object,
    onClick: PropTypes.func,
    filter: PropTypes.object,
    setFilter: PropTypes.func
};

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

//Корневая панель производственного плана цеха
const MechRecDeptCostProdPlans = () => {
    //Собственное состояние - таблица данных
    const [state, setState] = useDeptCostProdPlans();

    //Состояние для фильтра каталогов
    const [filter, setFilter] = useState({ planName: "" });

    //Массив отфильтрованных каталогов
    const filteredPlanCtgls = useFilteredPlans(state.planList, filter);

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

    //Выбор плана
    const selectPlan = plan => {
        setState(pv => ({
            ...pv,
            showIncomeFromDeps: null,
            showFcroutelst: null,
            selectedPlan: plan,
            showPlanList: false,
            dataLoaded: false,
            columnsDef: [],
            orders: null,
            rows: [],
            reload: true,
            pageNumber: 1,
            morePages: true
        }));
    };

    //Сброс выбора плана
    const unselectPlan = () =>
        setState(pv => ({
            ...pv,
            showIncomeFromDeps: null,
            showFcroutelst: null,
            selectedPlan: {},
            showPlanList: false,
            dataLoaded: false,
            columnsDef: [],
            orders: null,
            rows: [],
            reload: true,
            pageNumber: 1,
            morePages: true
        }));

    //Обработка нажатия на элемент в списке планов
    const handlePlanClick = plan => {
        if (state.selectedPlan.NRN != plan.NRN) selectPlan(plan);
        else unselectPlan();
    };

    //При изменении состояния сортировки
    const handleOrderChanged = ({ orders }) => setState(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));

    //При изменении количества отображаемых страниц
    const handlePagesCountChanged = () => setState(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));

    //При нажатии на "Заказ"
    const handleProdOrderClick = planSp => {
        setState(pv => ({ ...pv, showIncomeFromDeps: planSp }));
    };

    //При нажатии на "Обозначение"
    const handleMatresCodeClick = planSp => {
        setState(pv => ({ ...pv, showFcroutelst: planSp }));
    };

    //Генерация содержимого
    return (
        <Box p={2}>
            <Fab variant="extended" sx={STYLES.PLANS_BUTTON} onClick={() => setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}>
                Планы
            </Fab>
            <Drawer
                anchor={"left"}
                open={state.showPlanList}
                onClose={() => setState(pv => ({ ...pv, showPlanList: false }))}
                sx={STYLES.PLANS_DRAWER}
            >
                <PlanList
                    plans={filteredPlanCtgls}
                    selectedPlan={state.selectedPlan}
                    filter={filter}
                    setFilter={setFilter}
                    onClick={handlePlanClick}
                />
            </Drawer>
            <Grid container>
                <Grid item xs={12}>
                    <Box display="flex" justifyContent="center" alignItems="center">
                        {state.dataLoaded ? (
                            state.rows.length === 0 ? (
                                <InlineMsgInfo okBtn={false} text={"В плане отсутствуют записи спецификации"} />
                            ) : (
                                <Box sx={STYLES.CONTAINER}>
                                    <Typography sx={STYLES.TITLE} variant={"h6"}>
                                        {`Производственный план цеха №${state.selectedPlan.SSUBDIV} на ${state.selectedPlan.SPERIOD}`}
                                    </Typography>
                                    <Box>
                                        <P8PDataGrid
                                            {...P8P_DATA_GRID_CONFIG_PROPS}
                                            containerComponentProps={{ elevation: 6, sx: STYLES.DATA_GRID_CONTAINER }}
                                            fixedHeader={state.fixedHeader}
                                            fixedColumns={state.fixedColumns}
                                            columnsDef={state.columnsDef}
                                            rows={state.rows}
                                            size={P8P_DATA_GRID_SIZE.MEDIUM}
                                            morePages={state.morePages}
                                            reloading={state.reload}
                                            onOrderChanged={handleOrderChanged}
                                            onPagesCountChanged={handlePagesCountChanged}
                                            dataCellRender={prms => dataCellRender({ ...prms, handleProdOrderClick, handleMatresCodeClick })}
                                            groupCellRender={groupCellRender}
                                        />
                                    </Box>
                                </Box>
                            )
                        ) : !state.selectedPlan.NRN ? (
                            <InlineMsgInfo okBtn={false} text={"Укажите план для отображения спецификаций"} />
                        ) : null}
                    </Box>
                </Grid>
            </Grid>
            {state.showIncomeFromDeps ? (
                <IncomFromDepsDataGridDialog task={state.showIncomeFromDeps} onClose={() => handleProdOrderClick(null)} />
            ) : null}
            {state.showFcroutelst ? <CostRouteListsDataGridDialog task={state.showFcroutelst} onClose={() => handleMatresCodeClick(null)} /> : null}
        </Box>
    );
};

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

export { MechRecDeptCostProdPlans };
