import { observer } from 'mobx-react';
import React, { useContext, useEffect, useState } from 'react';
import ReactHtmlParser from 'react-html-parser';
import useSWR from 'swr';
import { LISTE_TYPE_DECISIONS } from '../../../constantes/constantes';
import AppConfigStore, { AppConfigContext } from '../../../stores/AppConfigStore';
import { Chargement } from '../../Commun/Chargement';
import { Erreur } from '../../Commun/Erreur';
import AGGridConfigurationAdministres from '../../Commun/listes/configuration/AGGridConfigurationAdministres';
import AGGridConfigurationPostes from '../../Commun/listes/configuration/AGGridConfigurationPostes';
import {
    getNbAdministresAffectables,
    getNbAdministresAffectes,
    getNbAdministresEncoreAffectables
} from '../../Commun/listes/helpers/business-data-helpers';
import '../Commun/AffectationsPrevuesEtSuggerees.scss';
import ListeAffectations from '../Commun/ListeAffectations';
import { ListeAffectationsSuggereesPoste } from './ListeAffectationsSuggereesPoste';

/**
 * Composant "Affectations prévues et suggérées" pour le poste sélectionné dans l'aide à la décision (volet de droite).
 *
 * @component
 * @param {array} props.context - Le contexte d'affichage de la liste
 *
 * @example
 * return (
 * <AffectationsPrevuesEtSuggereesPoste context={context}/>
 * )
 */
const AffectationsPrevuesEtSuggereesPoste = observer((props) => {
    /** @type {AppConfigStore} */
    const appConfig = useContext(AppConfigContext);

    const agGridConfigurationAdministres = new AGGridConfigurationAdministres(appConfig.donneesReference);
    const agGridConfigurationPostes = new AGGridConfigurationPostes(appConfig.donneesReference);

    // Année selectionnée
    const pam_annee = appConfig.PAMSelectionne;

    // Création des params 
    const params_decision = {};

    // Ajout de l'année selectionnée au params 
    annee && (params_decision.pam_annee = annee);

    // Données concernant les décisions sur le poste
    const callKey = appConfig.managers.postes.buildDecisionFetchKey(appConfig.selectedPosteDecision?.id, params_decision);
    const { data, error } = useSWR(callKey);
    const [administresAffectes, setAdministresAffectes] = useState([]);
    useEffect(() => {
        setAdministresAffectes(
            data
                ? agGridConfigurationAdministres.adapteAffectationAdministresSuggereesPourPoste(
                      data,
                      '' //TODO AKA rang à récupérer avec la décision si c'est possible
                  )
                : []
        );
    }, [data]);

    // Données concernant le poste sélectionné
    const annee = appConfig.PAMSelectionne;
    const params_poste = {};
    annee && (params_poste.pam__in = annee);
    annee && (params_poste.pam_annee = annee);
    const getKey = () => appConfig.managers.postes.buildGetCallKey(appConfig.selectedPosteDecision?.id_pam);
    const { data: dataPosteSelectionne, error: errorPosteSelectionne } = useSWR(getKey);
    const [posteSelectionne, setPosteSelectionne] = useState(undefined);
    useEffect(() => {
        setPosteSelectionne(dataPosteSelectionne ? agGridConfigurationPostes.adaptePoste(dataPosteSelectionne) : undefined);
    }, [dataPosteSelectionne]);

    /* Génération du paramétrage des groupes de colonnes et colonnes pour AG Grid */
    const affectationPrevueFields = agGridConfigurationAdministres.buildAffectationPostesColumnDefs([
        'rang',
        {
            groupId: 'identite',
            columns: [
                {
                    colId: 'identite_matricule',
                    override: { filter: false, width: 80 }
                },
                {
                    colId: 'identite_grade',
                    override: { filter: false}
                },
                {
                    colId: 'identite_nom',
                    override: { filter: false }
                },
                {
                    colId: 'identite_prenom',
                    override: { filter: false }
                },
                {
                    colId: 'identite_anciennete_grade',
                    override: { filter: false }
                },
            ]
        },
        {
            groupId: 'competences_NonEditable',
            columns: [{ colId: 'competences_competences', override: { headerName: 'Compétences', width: 120 } }]
        },
        {
            groupId: 'PAMEnCours_NonEditable',
            columns: [
                {
                    colId: 'PAMEnCours_notesUtilisateur',
                    override: { filter: false }
                },
                {
                    colId: 'PAMEnCours_marques',
                    override: { filter: false }
                },
            ]
        },
        {
            groupId: 'decision_NonEditable',
            columns: [
                {
                    colId: 'PAMEnCours_avis',
                    override: { filter: false }
                },
                {
                    colId: 'decision_decision',
                    override: { filter: false }
                },
                {
                    colId: 'decision_notesUtilisateur',
                    override: { filter: false }
                },
                {
                    colId: 'decision_ciat',
                    override: { filter: false }
                },
                {
                    colId: 'decision_specifique',
                    override: { filter: false }
                }
            ]
        },
        {
            groupId: 'affectationFuture_NonEditable',
            columns: [
                {
                    colId: 'affectationFuture_FE',
                    override: { filter: false }
                },
                {
                    colId: 'affectationFuture_libelle',
                    override: { filter: false }
                },
                {
                    colId: 'affectationFuture_lieu',
                    override: {
                        filter: false,
                        columnGroupShow: 'close',
                    }
                }
            ]
        },
        'classement'
    ]);

    const nbAffectables = getNbAdministresAffectables(appConfig.donneesReference, posteSelectionne);
    const nbAffectes = getNbAdministresAffectes(appConfig.donneesReference, posteSelectionne);
    const nbEncoreAffectables = getNbAdministresEncoreAffectables(appConfig.donneesReference, posteSelectionne);
    const titre =
        (nbAffectes > 0 ? nbAffectes : 'Aucune') +
        ' affectation' +
        (nbAffectes > 1 ? 's' : '') +
        ' prévue' +
        (nbAffectes > 1 ? 's' : '') +
        ' pour le poste  <em>« ' +
        appConfig.selectedPosteDecision.libelleGroupe +
        ' »</em> sur ' +
        nbAffectables +
        ' attendue' +
        (nbAffectables > 1 ? 's' : '');

    return (
        <>
            <div className="AffectationsPrevuesEtSuggerees d-flex flex-column px-2 pt-2 ">
                {!data || !dataPosteSelectionne ? (
                    error || errorPosteSelectionne ? (
                        <Erreur />
                    ) : (
                        <Chargement />
                    )
                ) : (
                    <>
                        <h3 className="AffectationPrevueHeader">{ReactHtmlParser(titre)}</h3>
                        {!data || !data.length ? (
                            <span>
                                <i>Il n’y a encore aucune affectation ou pré-affectation d’administré prévue pour ce poste.</i>
                            </span>
                        ) : (
                            <>
                                {nbAffectes > nbAffectables && (
                                    <p className="alerte">
                                        ⚠ Il devrait y avoir au plus {nbAffectables} administré{nbAffectables > 1 ? 's' : ''} affecté
                                        {nbAffectables > 1 ? 's' : ''} sur ce poste.
                                    </p>
                                )}

                                <div className="AffectationPrevueDetail">
                                    <ListeAffectations
                                        columnDefs={affectationPrevueFields}
                                        data={administresAffectes}
                                        nbItems={1}
                                        label={'affectation'}
                                        context={{ ...props.context, ...{ listeType: LISTE_TYPE_DECISIONS } }}
                                    />
                                </div>
                            </>
                        )}
                    </>
                )}

                <ListeAffectationsSuggereesPoste context={props.context} />
            </div>
        </>
    );
});

export default AffectationsPrevuesEtSuggereesPoste;
