import { observer } from 'mobx-react';
import React, { useContext, useEffect, useState } from 'react';
import { BiUnlink } from 'react-icons/all';
import useSWR from 'swr';
import { DECISIONS, LISTE_TYPE_DECISIONS } from '../../../constantes/constantes';
import AppConfigStore, { AppConfigContext } from '../../../stores/AppConfigStore';
import { Chargement } from '../../Commun/Chargement';
import { Erreur } from '../../Commun/Erreur';
import AGGridConfigurationPostes from '../../Commun/listes/configuration/AGGridConfigurationPostes';
import '../Commun/AffectationsPrevuesEtSuggerees.scss';
import ListeAffectations from '../Commun/ListeAffectations';
import { ListeAffectationsSuggereesAdministre } from './ListeAffectationsSuggereesAdministre';

/**
 * Composant "Affectations prévue et suggérées" pour l'administré 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 (
 * <AffectationsPrevueEtSuggereesAdministre context={context} />
 * )
 */
const AffectationsPrevueEtSuggereesAdministre = observer((props) => {
    /** @type {AppConfigStore} */
    const appConfig = useContext(AppConfigContext);

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

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

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


    const getKey = () => appConfig.managers.administres.buildDecisionFetchKey(appConfig.selectedAdministreDecision?.id, params);
    const { data, error } = useSWR(getKey);

    const [posteAffecte, setPosteAffecte] = useState([]);
    const [libelleLienAnnulation, setLibelleLienAnnulation] = useState(undefined);

    const agGridConfigurationPostes = new AGGridConfigurationPostes(appConfig.donneesReference);

    useEffect(() => {
        if (data && data.length) {
            const postesAffectes = agGridConfigurationPostes.adapteAffectationPostesSuggereesPourAdministre(
                data,
                appConfig.selectedAdministreDecision.id
            );
            setPosteAffecte(postesAffectes[0]);

            if (postesAffectes?.length) {
                let lib = 'Annuler ';
                switch (postesAffectes[0]?.decision_decision) {
                    case DECISIONS.PREPOSITIONNE:
                        lib += 'ce prépositionnement';
                        break;

                    case DECISIONS.POSITIONNE:
                        lib += 'ce positionnement';
                        break;

                    case DECISIONS.OMI_EN_COURS:
                        lib += 'cet OMI en cours';
                        break;

                    case DECISIONS.OMI_ACTIVE:
                        lib += 'cet OMI activé';
                        break;
                }
                setLibelleLienAnnulation(lib);
            }
        }
    }, [data]);

    /* Génération du paramétrage des groupes de colonnes et colonnes pour AG Grid */
    const affectationPrevueFields = agGridConfigurationPostes.buildAffectationAdministresColumnDefs([
        'rang',
        {
            groupId: 'organisme',
            columns: [
                {
                    colId: 'organisme_departement',
                    override: { width: 60 }
                },
                {
                    colId: 'organisme_FE'
                },
                {
                    colId: 'organisme_libelle'
                },
                {
                    colId: 'organisme_lieu'
                }
            ]
        },
        {
            groupId: 'poste_NonEditable',
            columns: [
                {
                    colId: 'poste_id',
                    override: { filter: false }
                },
                {
                    colId: 'poste_domaine',
                    override: { filter: false }
                },
                {
                    colId: 'poste_filiere',
                    override: { filter: false }
                },
                {
                    colId: 'poste_NF',
                    override: { filter: false }

                },
                {
                    colId: 'poste_ETR',
                    override: { filter: false }
                },
                {
                    colId: 'PAMEnCours_marques',
                    override: {
                        filter: false,
                        columnGroupShow: 'open'
                    }
                },
                {
                    colId: 'poste_CIAT',
                    override: {
                        filter: false,
                        columnGroupShow: 'open'
                    }
                },
                {
                    colId: 'poste_specifique',
                    override: {
                        filter: false,
                        columnGroupShow: 'open'
                    }
                },
                {
                    colId: 'poste_competences',
                    override: { width: 100, filter: false, type: ['competencesColumn'] }
                },
            ]
        },
        'avis_NonEditable',
        'classement',
    ]);

    return (
        <>
            <div className="AffectationsPrevuesEtSuggerees d-flex flex-column px-2 pt-2 ">
                {typeof data == 'undefined' ? (
                    error ? (
                        <Erreur />
                    ) : (
                        <Chargement />
                    )
                ) : (
                    <>
                        <h3 className="AffectationPrevueHeader">
                            Affectation prévue pour l'administré <em>« {appConfig.selectedAdministreDecision.identite_grade_nom_prenom} »</em>
                        </h3>

                        {!data || !data.length ? (
                            <span>
                                <i>L’administré n’a pas encore été lié à un poste par une décision.</i>
                            </span>
                        ) : (
                            <div className="AffectationPrevueDetail">
                                <div className="SupprimerPrevisionAffectationLink">
                                    <a
                                        href="#"
                                        className="withIcon"
                                        onClick={(event) => {
                                            event.preventDefault();

                                            appConfig.actionsMetierHelper.creeOuMAJDecisionAdministreAvecPoste(
                                                appConfig.selectedAdministreDecision.id,
                                                posteAffecte.id,
                                                DECISIONS.AUCUNE,
                                                posteAffecte.decision_decision,
                                            );
                                            //TODO AKA si possible mettre à jour immédiatement l'affichage lors d'un changement ou suppression de décision
                                        }}
                                    >
                                        <BiUnlink size={'15px'} />
                                        <span>{libelleLienAnnulation}</span>
                                    </a>
                                </div>
                                <ListeAffectations
                                    columnDefs={affectationPrevueFields}
                                    data={[posteAffecte]}
                                    nbItems={1}
                                    label={'affectation'}
                                    context={{ ...props.context, ...{ listeType: LISTE_TYPE_DECISIONS } }}
                                />
                            </div>
                        )}
                    </>
                )}

                <ListeAffectationsSuggereesAdministre context={props.context} idPosteDejaAffecte={posteAffecte?.id} />
            </div>
        </>
    );
});

export default AffectationsPrevueEtSuggereesAdministre;
