import i18n from '../../../../i18n/i18n';
import { buildColumnDefs, buildAndAddColGroupDefVariant, buildAndAddandDelColGroupDefVariant } from './AGGridConfigurationCommun';
import { createMarquesComparator } from '../helpers/business-data-helpers';
import { getDomaine, getFiliere } from '../../listes/helpers/business-data-helpers';
import {
    MARQUES_SEPARATEUR,
    COMPETENCES_SEPARATEUR,
    COMPETENCES_POSTES_MAX_ITEMS
} from '../../../../constantes/constantes';
import { FILTER_PARAMS_EXCEL_MODE, commonColTypes } from '../commonAGGridColumnTypes';
import { creerFormateurParams, creerColDefDonneesRef, getRefs, toStartOfDayOrDefault } from '../commonAGGridFunctions';
import { getDecisionLabel, getLibelleAvisPoste } from '../../../../helpers/i18n-helper';
import extend from 'just-extend';

/**
 * Classe de fonctions de paramétrage des colonnes à afficher dans les listes AG Grid de postes et de mapping des données issues de l'API.
 *
 * @class
 */
class AGGridConfigurationPostes {
    /**
     * Constructeur
     * @param {import('../../../../jsdoc/types').DonneesReference} donneesReference - Données de référence
     */
    constructor(donneesReference) {
        this.donneesReference = donneesReference;
        this.completeColumnDefs = this.buildCompleteColumnDefs();
    }

    /**
     * Génère l'objet columnDefs pour l'affichage d'une liste de postes.
     * @param {(string|import('../../../../jsdoc/types').ColGroupDefConstruction)[]} groupsAndColumns - Liste des groupes de colonnes et des colonnes à générer
     * @returns {import('../../../../jsdoc/types').AppColGroupDef[]} - Object columnDefs de définition des groupes de colonnes et colonnes à ajouter à la liste
     */
    buildPostesColumnDefs(groupsAndColumns) {
        return buildColumnDefs(groupsAndColumns, this.completeColumnDefs);
    }

    /**
     * Adapte les données des postes reçues du backend pour l'affichage dans AG Grid.
     *
     * @param {?Object[]} postes - Liste des postes
     * @returns {Array.<Object>} liste mappée des postes adaptés
     */
    adaptePostes(postes) {
        return postes?.map((p) => this.adaptePoste(p)) ?? [];
    }

    /**
     * Adapte les données d'UN poste reçues du backend, pour l'affichage dans AG Grid :
     * - Mapping des champs
     * - Ajout de valeur par défaut pour les données manquantes (généralement '')
     * - Ajout de certains champs calculés (ex : identite_age, service_temps)
     *
     * @param {<Object>} p - Objet contenant les données issues du backend pour un poste
     * @returns {<Object>} Objet normalisé et complété, pour affichage dans AG Grid
     */
    adaptePoste(p) {
        const domaine = getDomaine(this.donneesReference, p.p_domaine || '');
        const domaineCode = domaine ? domaine.code : i18n.global.donnees.vide;

        const filiere = getFiliere(this.donneesReference, p.p_filiere || '');
        const filiereCode = filiere ? filiere.code : i18n.global.donnees.vide;

        const posteAdapte = {
            // Id unique
            id: p.p_id,
            id_pam : p.id,
            de_decisions:p.de_decision ? p.de_decision : '',
            decisions: p.decisions[0]?.de_decision ? p.decisions[0]?.de_decision : ' ',

            // Id du poste
            poste_id: p.p_id,


            // Libellé du GROUPE du poste
            libelleGroupe: [
                p.formation_emploi?.fe_code,
                p.p_eip,
                p.p_code_fonction ? p.p_fonction || p.p_code_fonction : null
            ].filter(Boolean).join(' / '),

            // Pondérations
            ponderations_filiere: parseFloat(p.p_poids_filiere) || 0,
            ponderations_nf: parseFloat(p.p_poids_nf) || 0,
            ponderations_competences: parseFloat(p.p_poids_competences) || 0,

            // Organisme : département et garnison
            organisme_departement: p.p_dep || '',
            organisme_FE: p.formation_emploi ? p.formation_emploi.fe_code : '',
            organisme_libelle: p.formation_emploi ? p.formation_emploi.fe_libelle : '',
            organisme_lieu: p.formation_emploi ? p.formation_emploi.fe_garnison_lieu : '',
            organisme_zone_defense: p.formation_emploi?.zone_defense,
            organisme_codeFeMere: p.formation_emploi?.mere?.fe_code,
            organisme_libelleFeMere: p.formation_emploi?.mere?.fe_libelle,
            organisme_infoReo: p.info_reo ? p.info_reo: '',

            // Poste
            poste_id: p.p_id || '',
            poste_nfs: p.p_nfs == 'nan' ? '' : p.p_nfs,
            poste_domaine: p.p_domaine || '',
            poste_filiere: p.p_filiere || '',
            poste_NF: p.p_nf ? p.p_nf.toUpperCase() : '',
            poste_domaine_filiere_NF: domaineCode + ' / ' + filiereCode + ' / ' + (p.p_nf ? p.p_nf.toUpperCase() : ''),
            poste_competences: p.competences ? p.competences : [],
            poste_ETR: p.p_fonction || '',
            PAMEnCours_marques: p.p_liste_id_marques ? p.p_liste_id_marques.split(MARQUES_SEPARATEUR) : [],
            poste_CIAT: p.p_ciat ? true : false,
            poste_specifique: p.p_specifique ? p.p_specifique : '',

            // PAM en cours
            PAMEnCours_notesUtilisateur: p.p_notes_gestionnaire_pam || '',


            PAMEnCours_priorisationPcp: p.p_priorisation_pcp_pam,
            // PAMEnCours_propositionsArmement: (
            //     (value, refs) => value ? refs.find(r => r.id === value)?.libelle ?? '[' + value + ']' : value
            // )(p.propositions_armement_pam, this.donneesReference.propositionsArmement),

            // Avis
            priorite_drhat: p.p_avis_pam ?? this.donneesReference.avisPosteDefaut,
            priorite_fe: p.p_avis_fe_pam ?? this.donneesReference.avisPosteDefaut,

            // Décisions
            decision_dateDecision: toStartOfDayOrDefault(p.decisions[0]?.de_date_decision),
            direct_commissionne: p.p_direct_commissionne_pam,
            decisions_militairesAffectes: p.decisions[0]?.administre ? p.decisions[0]?.administre + " " + "/" + " " + p.decisions[0]?.grade +  " " + p.decisions[0]?.nom + " " + p.decisions[0]?.prenom : " ",
            decisions_administre_id_pam: p.decisions[0]?.administre_pam,

            // Périmètre
            perimetre_sousVivier_id: p.sous_viviers ? p.sous_viviers.map(function(e) {return e['sv_id']}) : '',
            perimetre_sousVivier_libelle: p.sous_viviers ? p.sous_viviers.map(function(e) {return e['sv_libelle']}) : '',
            perimetre_formationEmploi_id: p.formation_emploi || '',

            // Rattachement à un périmètre (ITD seulement)
            p_itd_cellule : p.p_itd_cellule || ''

        };

        // Avis
        for (let ap of this.donneesReference.avisPoste) {
            posteAdapte['p_nb_' + ap.code.toLowerCase()] = parseInt(p['p_nb_' + ap.code.toLowerCase()] || 0, 10);
        }

        // Décisions (suite)
        this.donneesReference.decisionsById.forEach((_, decision) => {
            posteAdapte['p_nb_' + decision.toLowerCase()] = parseInt(p['p_nb_' + decision.toLowerCase()] || 0, 10);
        });

        return posteAdapte;
    }

    /**
     * Génère l'objet columnDefs pour l'affichage d'une liste de postes.
     * @param {(string|import('../../../../jsdoc/types').ColGroupDefConstruction)[]} groupsAndColumns - Liste des groupes de colonnes et des colonnes à générer
     * @returns {import('../../../../jsdoc/types').AppColGroupDef[]} - Object columnDefs de définition des groupes de colonnes et colonnes à ajouter à la liste
     */
    buildAffectationAdministresColumnDefs(groupsAndColumns) {
        return buildColumnDefs(groupsAndColumns, this.completeColumnDefs);
    }

    /**
     * Adapte les données des postes reçus du backend pour l'affichage dans AG Grid.
     *
     * @param {Array.<Object>} notations - Liste des affectations pour un administré
     * @param {Number} administreId - Id de l'administré
     * @returns {Array.<Object>} liste mappée des administrés adaptés
     */
    adapteAffectationPostesSuggereesPourAdministre(notations, administreId) {
        return notations.map((a, index) => this.adapteAffectationPosteSuggereePourAdministre(a, index + 1, administreId));
    }

    /**
     * Adapte les données d'une affectation d'un administré reçue du backend, pour l'affichage dans AG Grid :
     * - Mapping des champs
     * - Ajout de valeur par défaut pour les données manquantes (généralement '')
     * - Ajout de certains champs calculés (ex : identite_age, service_temps)
     *
     * @param {<Object>} notation - Objet contenant les données issues du backend pour un administré
     * @param {<Number>} rang - rang
     * @param {Number} administreId - Id de l'administré
     * @returns {<Object>} Objet normalisé et complété, pour affichage dans AG Grid
     */
    adapteAffectationPosteSuggereePourAdministre(notation, rang, administreId) {
        const poste = notation.poste;

        const domaine = getDomaine(this.donneesReference, poste.p_domaine || '');
        const domaineCode = domaine ? domaine.code : i18n.global.donnees.vide;

        const filiere = getFiliere(this.donneesReference, poste.p_filiere || '');
        const filiereCode = filiere ? filiere.code : i18n.global.donnees.vide;

        const posteAdapte = {
            // Id unique
            id: poste.p_id,

            // Id du poste
            poste_id: poste.p_id || '',

            // Libellé du GROUPE du poste
            libelleGroupe:
                poste.formation_emploi__fe_code +
                ' / ' +
                poste.p_eip +
                (poste.p_code_fonction ? ' / ' + poste.p_fonction || poste.p_code_fonction : ''),

            // Rang
            poste_rang: rang,

            // Organisme : département et garnison
            organisme_departement: poste.p_dep || '',
            organisme_FE: poste.formation_emploi__fe_code || '',
            organisme_libelle: poste.formation_emploi__fe_libelle || '',
            organisme_lieu: poste.formation_emploi__fe_garnison_lieu || '',

            // Poste
            poste_domaine: poste.p_domaine || '',
            poste_filiere: poste.p_filiere || '',
            poste_NF: poste.p_nf ? poste.p_nf.toUpperCase() : '',
            poste_domaine_filiere_NF: domaineCode + ' / ' + filiereCode + ' / ' + (poste.p_nf ? poste.p_nf.toUpperCase() : ''),
            poste_competences: poste.competence ? poste.competence.split(COMPETENCES_SEPARATEUR) : [],
            poste_ETR: poste.p_fonction || '',
            // poste_priorite : poste.p_avis || '',

            // PAM en cours
            PAMEnCours_notesUtilisateur: poste.p_notes_gestionnaire_pam || '',
            PAMEnCours_marques: poste.p_liste_id_marques ? poste.p_liste_id_marques.split(MARQUES_SEPARATEUR) || [] : [],

            // PdV
            //classement_administre: p.nb_top || '',
            classement_poste: notation.no_score_administre,
            classement_coupleIdeal: !!notation.no_flag_cple_ideal,

            // Avis
            priorite_drhat: poste.p_avis_pam ?? this.donneesReference.avisPosteDefaut,
            priorite_fe: poste.p_avis_fe_pam ?? this.donneesReference.avisPosteDefaut,

            // Décision
            decision_notesUtilisateur: notation.de_notes_gestionnaire || '',
            decision_decision: notation.de_decision || '',
            decision_dateDecision: toStartOfDayOrDefault(notation.decision__de_date_decision),
            decision_libelle: getDecisionLabel(notation.de_decision, this.donneesReference),
            decision_administreId: notation.de_decision ? administreId : '',
            decision_posteId: notation.de_decision ? poste.p_id || '' : ''
        };

        // TODO adapter le fonctionnement des avis aux administrés
        // Avis
        for (let ap of this.donneesReference.avisPoste) {
            posteAdapte['p_nb_' + ap.code.toLowerCase()] = parseInt(poste['p_nb_' + ap.code.toLowerCase()] || 0, 10);
        }

        // Décisions (suite)
        this.donneesReference.decisionsById.forEach((_, decision) => {
            posteAdapte['p_nb_' + decision.toLowerCase()] = parseInt(poste['p_nb_' + decision.toLowerCase()] || 0, 10);
        })

        return posteAdapte;
    }

    /**
     * Création de la définition de tous les groupes de colonnes et de toutes les colonnes
     */
    buildCompleteColumnDefs = function () {
        const colonnesPostePonderees = ['ponderations_filiere', 'ponderations_nf', 'ponderations_competences'];

        const colDefs = [
            // ---------------------------------------------------------------------------------------------
            // ORGANISME
            // ---------------------------------------------------------------------------------------------
            {
                groupId: 'organisme',
                headerName: 'Organisme',
                children: [
                    {
                        colId: 'organisme_departement',
                        field: 'organisme_departement',
                        headerName: 'Dé\u00ADpt',
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                        width: 120
                    },
                    {
                        colId: 'organisme_FE',
                        field: 'organisme_FE',
                        tooltipValueGetter: (params) =>
                            params?.data?.organisme_FE ? params?.data?.organisme_FE + ' (' + params?.data?.organisme_libelle + ')' : '',
                        headerName: 'Co\u00ADde FE',
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                        width: 75
                    },
                    {
                        colId: 'organisme_libelle',
                        field: 'organisme_libelle',
                        headerName: 'Libellé',
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                        width: 120
                    },
                    {
                        colId: 'organisme_lieu',
                        field: 'organisme_lieu',
                        headerName: 'Li\u00ADeu',
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                        width: 120
                    },
                    {
                        colId: 'organisme_zone_defense',
                        field: 'organisme_zone_defense',
                        headerName: 'Zo\u00ADne de dé\u00ADfen\u00ADse',
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                        columnGroupShow: 'open',
                        width: 120
                    },
                    {
                        colId: 'organisme_codeFeMere',
                        field: 'organisme_codeFeMere',
                        headerName: 'Co\u00ADde FE mè\u00ADre',
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                        columnGroupShow: 'open',
                        width: 75
                    },
                    {
                        colId: 'organisme_libelleFeMere',
                        field: 'organisme_libelleFeMere',
                        headerName: 'FE mè\u00ADre',
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                        columnGroupShow: 'open',
                        width: 120
                    },
                    {
                        colId: 'organisme_infoReo',
                        field: 'organisme_infoReo',
                        headerName: 'In\u00ADfo REO',
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                        columnGroupShow: 'open',
                        type: [commonColTypes.editableColumn, commonColTypes.setColumn],
                        width: 70,
                        cellStyle: params => {
                            if (params.value === 'SUP REO') {
                                return {color: 'black', backgroundColor: 'red'};
                            }
                            if (params.value === 'CRÉE REO A+1') {
                                return {color: 'black', backgroundColor: 'darkseagreen'};
                            }
                            return null;
                        }
                    }
                ]
            },

            // ---------------------------------------------------------------------------------------------
            // Poste
            // ---------------------------------------------------------------------------------------------
            {
                groupId: 'poste',
                headerName: 'Po\u00ADste',
                children: [
                    {
                        colId: 'poste_id',
                        field: 'poste_id',
                        headerName: 'Numéro de poste',
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                        width: 160
                    },
                    {
                        colId: 'poste_nfs',
                        field: 'poste_nfs',
                        headerName: 'Domaine de gestion (BVT)',
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                        width: 200
                    },
                    {
                        colId: 'poste_domaine',
                        field: 'poste_domaine',
                        headerName: 'Domaine',
                        type: commonColTypes.domaineColumn,
                        filterParams: { newRowsAction: 'keep'},
                    },
                    {
                        colId: 'poste_filiere',
                        field: 'poste_filiere',
                        headerName: 'Filière',
                        type: commonColTypes.filiereColumn,
                        filterParams: { newRowsAction: 'keep'},
                    },
                    {
                        colId: 'poste_NF',
                        field: 'poste_NF',
                        headerName: 'NF',
                        type: commonColTypes.NFColumn,
                        filterParams: { newRowsAction: 'keep'},
                    },
                    {
                        colId: 'poste_ETR',
                        field: 'poste_ETR',
                        headerName: 'ETR',
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                        width: 120
                    },
                    {
                        colId: 'PAMEnCours_marques',
                        field: 'PAMEnCours_marques',
                        tooltipValueGetter: () => '',
                        headerName: 'Mar\u00ADques PAM en cours',
                        type: [commonColTypes.editableColumn, commonColTypes.setColumn],
                        cellRenderer: 'marquesCellRenderer',
                        cellEditor: 'marquesCellEditor',
                        width: 150,
                        filterParams: {
                            excelMode: FILTER_PARAMS_EXCEL_MODE,
                            cellRenderer: 'marquesCellRenderer',
                            suppressMiniFilter: true,
                            comparator: createMarquesComparator(this.donneesReference)
                        }
                    },
                    {
                        colId: 'poste_competences',
                        field: 'poste_competences',
                        headerName: 'Compétence nécessaire',
                        type: [commonColTypes.editableColumn, commonColTypes.competencesColumn],
                        cellEditorParams: {
                            maxSelectedItems: COMPETENCES_POSTES_MAX_ITEMS
                        },
                        filterParams: { newRowsAction: 'keep'},
                        width: 200
                    },
                    {
                        colId: 'poste_domaine_filiere_NF',
                        field: 'poste_domaine_filiere_NF',
                        headerName: 'Dom. / Fil. / NF',
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                        width: 110,
                        notDisplayedByDefault: true
                    },
                    {
                        colId: 'poste_CIAT',
                        field: 'poste_CIAT',
                        headerName: 'CIAT',
                        type: [commonColTypes.editableColumn, commonColTypes.setColumn],
                        width: 70,
                        tooltipValueGetter: (params) => {
                            if (!params.value) {
                                return '';
                            }
                            const choix = getRefs(params)?.CIATById?.get(params.value);
                            return choix ? choix.libelle : '[' + params.value + ']';
                        },
                        filterParams: {
                            newRowsAction: 'keep',
                            excelMode: FILTER_PARAMS_EXCEL_MODE,
                            valueFormatter: (params) => {
                                if (!params.value) {
                                    return '';
                                }
                                var isTrueSet = (params.value === 'true');
                                const choix = getRefs(params)?.CIATById?.get(isTrueSet);
                                return choix ? choix.libelle : '[' + params.value + ']';
                            }
                        },
                        cellRenderer: 'ciatCellRenderer',
                        cellEditor: 'agRichSelectCellEditor',
                        cellEditorParams: (params) => ({
                            values: [...this.donneesReference.CIAT.map((c) => c.id)],
                            formatValue: (value) => {
                                const choix = this.donneesReference.CIATById.get(value);
                                return choix ? choix.libelle : '';
                            },
                        }),
                    },
                    {
                        colId: 'poste_specifique',
                        field: 'poste_specifique',
                        headerName: 'PPE / SHM / ITD',
                        type: [commonColTypes.editableColumn, commonColTypes.setColumn],
                        width: 140,
                        tooltipValueGetter: (params) => {
                            if (!params.value) {
                                return '';
                            }
                            const choix = getRefs(params)?.SpecifiqueById?.get(params.value);
                            return choix ? choix.libelle : '[' + params.value + ']';
                        },
                        filterParams: {
                            newRowsAction: 'keep',
                            excelMode: FILTER_PARAMS_EXCEL_MODE,
                            valueFormatter: (params) => {
                                if (!params.value) {
                                    return '';
                                }
                                const choix = getRefs(params)?.SpecifiqueById?.get(params.value);
                                return choix ? choix.libelle : '[' + params.value + ']';
                            }
                        },
                        cellRenderer: 'specifiqueCellRenderer',
                        cellEditor: 'agRichSelectCellEditor',
                        cellEditorParams: (params) => ({
                            values: [...this.donneesReference.Specifique.map((c) => c.id)],
                            formatValue: (value) => {
                                const choix = this.donneesReference.SpecifiqueById.get(value);
                                return choix ? choix.libelle : '';
                            },
                        }),
                    },
                    // {
                    //     colId: 'poste_priorite',
                    //     field: 'poste_priorite',
                    //     headerName: 'Priorité du poste',
                    //     type: commonColTypes.setColumn,
                    //     width: 120
                    // },
                ]
            },
            // ---------------------------------------------------------------------------------------------
            // Pondérations éditables
            // ---------------------------------------------------------------------------------------------
            {
                groupId: 'ponderations',
                headerName: 'Pondérations',
                children: [
                    {
                        colId: 'ponderations_filiere',
                        field: 'ponderations_filiere',
                        headerName: 'Filière',
                        type: [commonColTypes.BLANK, commonColTypes.ponderationColumn],
                        filterParams: { newRowsAction: 'keep'},
                        cellEditorParams: {
                            colonnesPonderees: colonnesPostePonderees
                        }
                    },
                    {
                        colId: 'ponderations_nf',
                        field: 'ponderations_nf',
                        headerName: 'NF',
                        type: [commonColTypes.BLANK, commonColTypes.ponderationColumn],
                        filterParams: { newRowsAction: 'keep'},
                        cellEditorParams: {
                            colonnesPonderees: colonnesPostePonderees
                        }
                    },
                    {
                        colId: 'ponderations_competences',
                        field: 'ponderations_competences',
                        headerName: 'Compétences',
                        type: [commonColTypes.BLANK, commonColTypes.ponderationColumn],
                        filterParams: { newRowsAction: 'keep'},
                        cellEditorParams: {
                            colonnesPonderees: colonnesPostePonderees
                        }
                    }
                ]
            },

            // ---------------------------------------------------------------------------------------------
            // PAM en cours complet
            // ---------------------------------------------------------------------------------------------
            {
                groupId: 'PAMEnCours',
                headerName: 'No\u00ADtes PAM en cours',
                children: [
                    {
                        colId: 'PAMEnCours_notesUtilisateur',
                        field: 'PAMEnCours_notesUtilisateur',
                        headerName: 'Pro\u00ADpo\u00ADsi\u00ADtions de mi\u00ADli\u00ADtai\u00ADres',
                        type: [commonColTypes.editableColumn, commonColTypes.notesColumn],
                        filterParams: { newRowsAction: 'keep'},
                    },
                    {
                        colId: 'PAMEnCours_priorisationPcp',
                        field: 'PAMEnCours_priorisationPcp',
                        headerName: 'Pri\u00ADo\u00ADri\u00ADsa\u00ADtion BMOB',
                        type: commonColTypes.notesColumn,
                        filterParams: { newRowsAction: 'keep'},
                    },
                    {
                        colId: 'PAMEnCours_propositionsArmement',
                        field: 'PAMEnCours_propositionsArmement',
                        headerName: "Pro\u00ADpo\u00ADsi\u00ADtions d'ar\u00ADme\u00ADment",
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                        cellEditor: 'agRichSelectCellEditor',
                        cellEditorParams: (params) => ({ values: ['', ...getRefs(params)?.propositionsArmement?.map(r => r.libelle)] }),
                        notDisplayedByDefault: true
                    }
                ]
            },

            // ---------------------------------------------------------------------------------------------
            // Avis
            // ---------------------------------------------------------------------------------------------
            {
                groupId: 'avis',
                headerName: 'A\u00ADvis',
                children: [
                    ...(() => {
                        const baseColDef = {
                            ...creerColDefDonneesRef((params) => getRefs(params)?.avisPosteById, {
                                formateurBase: creerFormateurParams(params => getLibelleAvisPoste(params.value, getRefs(params))),
                            }),
                            type: [commonColTypes.editableColumn, commonColTypes.setColumn],
                            filterParams: { newRowsAction: 'keep'},
                            width: 140
                        };
                        return [
                            extend(true, {}, baseColDef, {
                                colId: 'priorite_drhat',
                                field: 'priorite_drhat',
                                headerName: 'Pri\u00ADo\u00ADri\u00ADté du pos\u00ADte DRHAT',
                            }),
                            extend(true, {}, baseColDef, {
                                colId: 'priorite_fe',
                                field: 'priorite_fe',
                                headerName: 'Pri\u00ADo\u00ADri\u00ADté du pos\u00ADte pour la FE',
                                columnGroupShow: 'open',
                            })
                        ];
                    })()
                ]
            },
            // ---------------------------------------------------------------------------------------------
            // Décisions
            // ---------------------------------------------------------------------------------------------
            {
                groupId: 'decisions',
                headerName: 'Décisions',
                children: [
                    {
                        colId: 'decisions',
                        field: 'decisions',
                        headerName: 'Statut',
                        type: 'setColumn',
                        filterParams: { newRowsAction: 'keep'},
                    },
                    {
                        colId: 'decision_dateDecision',
                        field: 'decision_dateDecision',
                        headerName: 'Date de la décision',
                        type: commonColTypes.dateColumn,
                        filterParams: { newRowsAction: 'keep'},
                        width: 100,
                        //cellEditorParams: {nullable: true}
                    },

                    {
                        colId: 'decisions_militairesAffectes',
                        field: 'decisions_militairesAffectes',
                        headerName: 'Militaires affectés (PAM joué)',
                        type: commonColTypes.setColumn,
                        filterParams: { newRowsAction: 'keep'},
                    },
                    {
                        colId: 'direct_commissionne',
                        field: 'direct_commissionne',
                        headerName: 'Direct/Commissionné',
                        type: [commonColTypes.editableColumn, commonColTypes.setColumn],
                        filterParams: { newRowsAction: 'keep'},
                        tooltipValueGetter: (params) => {
                            if (!params.value) {
                                return '';
                            }
                            const choix = getRefs(params)?.directCommissionneById?.get(params.value);
                            return choix ? choix.libelle : '[' + params.value + ']';
                        },
                        filterParams: {
                            excelMode: FILTER_PARAMS_EXCEL_MODE,
                            valueFormatter: (params) => {
                                if (!params.value) {
                                    return '';
                                }
                                const choix = getRefs(params)?.directCommissionneById?.get(params.value);
                                return choix ? choix.libelle : '[' + params.value + ']';
                            }
                        },
                        cellRenderer: 'directCommissionneCellRenderer',
                        cellEditor: 'agRichSelectCellEditor',
                        cellEditorParams: (params) => ({
                            values: [...this.donneesReference.directCommissionne.map((c) => c.id)],
                            formatValue: (value) => {
                                const choix = this.donneesReference.directCommissionneById.get(value);
                                return choix ? choix.libelle : '';
                            },
                        }),
                        width: 120
                    },

                ]
            },

            // ---------------------------------------------------------------------------------------------
            // Rattachement à un périmètre (ITD seulement)
            // ---------------------------------------------------------------------------------------------
            {
                groupId: 'rattachement_perimetre',
                headerName: 'Rattachement à un périmètre',
                children: [
                    {
                        colId: 'p_itd_cellule',
                        field: 'p_itd_cellule',
                        headerName: 'Cellule associée',
                        type: [commonColTypes.editableColumn, commonColTypes.setColumn],
                        filterParams: { newRowsAction: 'keep'},
                        width: 420,
                        cellEditor: 'agRichSelectCellEditor',
                        cellEditorParams: {
                            values: [...this.donneesReference.RefSvFils.map((c) => c.ref_sv_fil_code)],
                        }
                    }
                ]
            },

            // ---------------------------------------------------------------------------------------------
            // Décision (affectation prévue seulement)
            // ---------------------------------------------------------------------------------------------
            {
                groupId: 'decision',
                headerName: 'PAM en cours',
                children: [
                    {
                        colId: 'decision_decision',
                        field: 'decision_decision',
                        type: commonColTypes.decisionColumn,
                        filterParams: { newRowsAction: 'keep'},
                    },
                    {
                        colId: 'decision_dateDecision',
                        field: 'decision_dateDecision',
                        type: commonColTypes.dateDecisionColumn,
                        filterParams: { newRowsAction: 'keep'},
                    },
                    {
                        colId: 'decision_notesUtilisateur',
                        field: 'decision_notesUtilisateur',
                        type: commonColTypes.notesUtilisateurColumn,
                        filterParams: { newRowsAction: 'keep'},
                    }
                ]
            },

            // ---------------------------------------------------------------------------------------------
            // Rang (vue "Top N" seulement)
            // ---------------------------------------------------------------------------------------------
            {
                groupId: 'rang',
                headerName: 'Ra\u00ADng',
                children: [
                    {
                        colId: 'poste_rang',
                        field: 'poste_rang',
                        headerName: 'Ra\u00ADng',
                        type: commonColTypes.numberColumn,
                        filterParams: { newRowsAction: 'keep'},
                        pinned: 'left',
                        width: 60
                    }
                ]
            },

            // ---------------------------------------------------------------------------------------------
            // Classement (vue "Top N" seulement)
            // ---------------------------------------------------------------------------------------------
            {
                groupId: 'classement',
                headerName: 'Classement',
                children: [
                    /*
                    {
                        colId: 'classement_administre',
                        field: 'classement_administre',
                        headerName: 'Admin.',
                        type: commonColTypes.classementRangColumn
                    },*/
                    {
                        colId: 'classement_poste',
                        field: 'classement_poste',
                        headerName: 'Po\u00ADste',
                        type: commonColTypes.classementPourcentageColumn,
                        filterParams: { newRowsAction: 'keep'},
                    }
                ]
            }
        ];

        // --------
        // Ajout des versions non modifiables de certains groupes
        buildAndAddColGroupDefVariant(colDefs, 'avis', 'avis_NonEditable', {
            children: [
                {
                    // priorite_DRHAT
                    type : [commonColTypes.BLANK, commonColTypes.setColumn]
                },
                {
                    // priorite_fe
                    type : [commonColTypes.BLANK, commonColTypes.setColumn]
                },
            ]
        });

        buildAndAddColGroupDefVariant(colDefs, 'rattachement_perimetre', 'rattachement_perimetre_NonEditable', {
            children: [
                {type: [commonColTypes.BLANK, commonColTypes.setColumn]}
            ]
        });

        buildAndAddColGroupDefVariant(colDefs, 'decisions', 'decisions_NonEditable', {
            children: [
                {   //decisions_poste
                    //type : [commonColTypes.BLANK, commonColTypes.setColumn]
                },
                {},  //decision_dateDecision
                    //type: commonColTypes.dateColumn,
                {},   //decisions_militairesAffectes
                    //type: commonColTypes.setColumn
                {   //direct_commissionne
                    type: [commonColTypes.BLANK, commonColTypes.setColumn],
                },
            ]
        });

        buildAndAddColGroupDefVariant(colDefs, 'poste', 'poste_NonEditable', {
            children: [
                {
                    // poste_id
                },
                {
                    // poste_nfs
                },
                {
                    // poste_domaine
                },
                {
                    // poste_filiere
                },
                {
                    // poste_NF
                },
                {
                    // poste_ETR
                },
                {
                    // PAMEnCours_marques
                    type: [commonColTypes.BLANK, commonColTypes.setColumn]
                },
                // {}, // poste_nbPostesREO
                {
                    // poste_competences
                    type: [commonColTypes.BLANK, commonColTypes.competencesColumn]
                },
                {
                    // poste_domaine_filiere_NF
                },
                {
                    // poste_CIAT
                    type: [commonColTypes.BLANK, commonColTypes.setColumn]
                },
                {
                    // poste_specifique
                    type: [commonColTypes.BLANK, commonColTypes.setColumn]
                },
                // {
                //     // poste_priorite
                // },
            ]
        });

        buildAndAddandDelColGroupDefVariant(colDefs, 'poste',
                                            ['poste_id','poste_domaine','poste_filiere','poste_NF','poste_ETR',
                                            'poste_competences','poste_specifique'],'poste_ITD', {
            children: [
                {}, // poste_id
                {}, // poste_domaine
                {}, // poste_filiere
                {}, // poste_NF
                {}, // poste_ETR
                {

                    type: [commonColTypes.BLANK, commonColTypes.setColumn]
                },
                {
                    type: [commonColTypes.BLANK, commonColTypes.setColumn]
                },
            ]
        });

        buildAndAddandDelColGroupDefVariant(colDefs, 'decisions',
                                            ['decisions','decision_dateDecision'],'decision_ITD', {
            children: [
                {
                },
                {
                },
            ]
        });

        buildAndAddColGroupDefVariant(colDefs, 'PAMEnCours', 'PAMEnCours_PCP', {
            children: [
                {
                    // PAMEnCours_notesUtilisateur
                    type: [commonColTypes.BLANK, commonColTypes.notesColumn]
                },
                {
                    // PAMEnCours_priorisationPcp
                    type: [commonColTypes.editableColumn, commonColTypes.notesColumn]
                },
                {}  // PAMEnCours_propositionsArmement
            ]
        });

        buildAndAddColGroupDefVariant(colDefs, 'PAMEnCours', 'PAMEnCours_NonEditable', {
            children: [
                {
                    // PAMEnCours_notesUtilisateur
                    type: [commonColTypes.BLANK, commonColTypes.notesColumn]
                },
                {}, // PAMEnCours_priorisationPcp
            ]
        });

        return colDefs;
    };
}

export default AGGridConfigurationPostes;
