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

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

import React, { useState, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Typography } from "@mui/material"; //Интерфейсные элементы
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
import { P8PDataGrid } from "../../components/p8p_data_grid"; //Таблица данных
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
import { useStagesDataGrid } from "./stages_hooks"; //Хуки списка этапов проекта
import { STAGES_STYLES, projectStageDataCellRender } from "./stages_layouts"; //Дополнительная разметка и вёрстка клиентских элементов
import { StageDetail } from "./stage_detail"; //Компонент "Информация об этапе проекта"

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

//Список этапов проекта
const Stages = ({ projectRn, projectCode }) => {
    //Собственное состояние
    const [stages, setStages] = useState({ pageNumber: 1, orders: [] });

    //Состояние таблицы этапов
    const [stagesDataGrid] = useStagesDataGrid({ ...stages, projectRn });

    //Состояние информации о этапе
    const [stageInfo, setStageInfo] = useState({ showInfo: false, stage: null, sFaceAcc: null });

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

    //Отображение записи этапа проекта в штатном разделе
    const showProjectStage = (prn, rn) => {
        pOnlineShowUnit({
            unitCode: "Projects",
            inputParameters: [
                { name: "in_RN", value: prn },
                { name: "in_STAGE_RN", value: rn }
            ],
            modal: false
        });
    };

    //Отображение деталей этапа
    const showStageDetails = stage => setStageInfo(pv => ({ ...pv, showInfo: true, stage: stage["NRN"], sFaceAcc: stage["SFACEACC"] }));

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

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

    //Генерация содержимого
    return stagesDataGrid.init ? (
        <>
            <div style={STAGES_STYLES.CONTAINER}>
                <Typography variant={"subtitle2"} sx={STAGES_STYLES.TITLE}>
                    {`Этапы проекта "${projectCode}"`}
                </Typography>
                <P8PDataGrid
                    {...P8P_DATA_GRID_CONFIG_PROPS}
                    {...stagesDataGrid}
                    containerComponentProps={{ sx: STAGES_STYLES.DATA_GRID_CONTAINER, elevation: 0 }}
                    onPagesCountChanged={handlePagesCountChanged}
                    onOrderChanged={handleOrderChanged}
                    dataCellRender={prms => projectStageDataCellRender({ ...prms, showProjectStage, showStageDetails })}
                />
            </div>
            <StageDetail
                stageRn={stageInfo.stage}
                stageName={stageInfo.sFaceAcc}
                isOpen={stageInfo.showInfo}
                onClose={() => setStageInfo(pv => ({ ...pv, showInfo: false, stage: null, sFaceAcc: null }))}
            />
        </>
    ) : null;
};

//Контроль свойств компонента - Список этапов проекта
Stages.propTypes = {
    projectRn: PropTypes.number.isRequired,
    projectCode: PropTypes.string.isRequired
};

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

export { Stages };
