/**
 * @file fichier de typage pour améliorer l'intellisense
 */

/**
 * Forme des données de référence hors API
 * @typedef DonneesReferenceStatiques
 * @property {Object[]} NF
 * @property {Object[]} departements
 * @property {Object[]} propositionsArmement
 * @property {Object[]} statutConcerto
 * @property {Object[]} suiviPrevisionnelMilitaire
 * @property {Object[]} directCommissionne
 * @property {Object[]} CIAT
 * @property {Object[]} Specifique
 */

/**
 * Forme des données de référence hors API
 * @typedef DonneesReferenceCalculees
 * @property {Map<string,Object>} avisPosteById
 * @property {?string} avisPosteDefaut
 * @property {Map<string,Object>} decisionsById
 * @property {Map<string,Object>} domainesById
 * @property {Map<string,Object>} filieresById
 * @property {Map<string,Object>} NFById
 * @property {Map<string,Object>} FEsById
 * @property {Map<string,Object>} gradesById
 * @property {Map<string,Object>} avisAdministreById
 * @property {Map<number,Object>} groupesMarquesById
 * @property {Map<string,Object>} marquesById
 * @property {Map<string,Object>} statutFuturById
 * @property {Map<string,Object>} directCommissionneById
 * @property {Map<string,Object>} CIATById
 * @property {Map<string,Object>} PAMByStatut
 * @property {Map<string,Object>} SpecfiqueById
 * @property {Map<string,Object>} suiviPrevisionnelMilitaireById
 * @property {Map<string,Object>} competencesById
 * @property {Map<string,Object>} departementsById
 */

/**
 * Forme des données de référence
 * @typedef {import("./api").DonneesReferenceApi & DonneesReferenceStatiques & DonneesReferenceCalculees} DonneesReference
 * @property {Object[]} NF
 * @property {Object[]} departements
 * @property {Object[]} propositionsArmement
 * @property {Object[]} statutConcerto
 * @property {Object[]} suiviPrevisionnelMilitaire
 * @property {Object[]} directCommissionne
 */

/**
 * Structure qui contient une partie des statuts de décisions.
 * @readonly
 * @typedef TypeDecisions
 * @property {string} AUCUNE = pas un vrai statut, juste une valeur pour représenter l'absence de décision
 * @property {string} PROPOSITION_FE
 * @property {string} PREPOSITIONNE
 * @property {string} POSITIONNE
 * @property {string} OMI_EN_COURS
 * @property {string} OMI_ACTIVE
 */

/**
 * Structure qui contient tous les liens de navigation
 * @readonly
 * @typedef TypeLiensNavigation
 * @property {string} PERIMETRE
 * @property {string} GESTION_DECISIONS
 * @property {string} INDICATEURS
 */

/**
 * Type pour un profil de l'utilisateur
 * @typedef {string} Profil
 **/

/**
 * Structure qui contient tous les profils possibles
 * TODO : séparer profils globaux et locaux
 * @readonly
 * @typedef TypeProfils
 * @property {Profil} BVT        - gestionnaire breveté
 * @property {Profil} FILIERE    - gestionnaire de filière, on parle maintenant de BGCAT (gestionnaire du bureau gestion catégorielle)
 * @property {Profil} HME        - expert HME
 * @property {Profil} ITD        - gestionnaire inter-domaine
 * @property {Profil} PCP        - gestionnaire PCP, on parle maintenant de BMOB ("pameur" du bureau mobilité)
 * @property {Profil} PCP_ACTUEL - [administrés] gestionnaire PCP de l'affectation actuelle
 * @property {Profil} PCP_FUTUR  - [administrés] gestionnaire PCP de l'affectation future
 * @property {Profil} SUPER      - super utilisateur
 */

/**
 * Structure qui contient tous les profils possibles
 * @readonly
 * @typedef TypeStatutsCalcul
 * @property {string} AUCUN
 * @property {string} EN_ATTENTE
 * @property {string} EN_ATTENTE_ARRET
 * @property {string} EN_COURS
 * @property {string} TERMINE
 * @property {string} TERMINE_DE_FORCE
 * @property {string} ERREUR
 */

/**
 * Objet créé par Dayjs
 * @typedef {Object} Dayjs
 */

/**
 * Paramètre classique dans Ag Grid
 * @typedef AgGridParams
 * @property {*} value
 * @property {?ContexteAgGrid} context
 */

/**
 * Structure des managers
 * @typedef ContexteAgGrid_Managers
 * @property {import('../data-manager/AdministresManager').default} administres
 * @property {import('../data-manager/DecisionManager').default} decisions
 * @property {import('../data-manager/PostesManager').default} postes
 *
 * Contexte AgGrid
 * @typedef ContexteAgGrid
 * @property {ActionsMetierHelper} actionsMetierHelper
 * @property {DonneesReference} donneesReference
 * @property {string} groupeType
 * @property {TypeProfils} profil - profil sélectionné
 * @property {ContexteAgGrid_Managers} managers
 * @property {Function} mutator
 */

/**
 * Basé sur AppColDef mais il s'agit d'un paramètre pour construire les colonnes
 * @typedef ColDefConstruction
 * @property {string} colId
 * @property {?Object} override - propriétés de AppColDef à surcharger
 */

/**
 * Basé sur AppColGroupDef mais il s'agit d'un paramètre pour construire les colonnes
 * @typedef ColGroupDefConstruction
 * @property {string} groupId
 * @property {?Object} override - propriétés de AppColGroupDef à surcharger
 * @property {?(string|ColDefConstruction)[]} columns - colonnes spécifiques
 */

/**
 * Champs en plus pour ColDef
 * @typedef AppColDef_Extra_Selecteur
 * @property {?string[]} selecteur.tags - tags éligibles
 * @property {?Profil[]} selecteur.profils - profils éligibles
 *
 * Fonction qui complète 'editable' pour conditionner l'édition
 * @callback AppColDef_Extra_EditableIf
 * @param {AgGridParams} params
 * @returns {boolean} true pour valider l'édition, false sinon
 *
 * Champs en plus pour ColDef
 * @typedef AppColDef_Extra
 * @property {?AppColDef_Extra_EditableIf} editableIf - à combiner avec 'editable' pour conditionner l'édition
 * @property {?boolean} notDisplayedByDefault
 * @property {?AppColDef_Extra_Selecteur} selecteur   - infos supplémentaires pour la sélection
 *
 * ColDef avec des champs en plus
 * @typedef {import('ag-grid-community').ColDef & AppColDef_Extra} AppColDef
 */

/**
 * ColGroupDef avec des AppColDef
 * @typedef {import('ag-grid-community').ColGroupDef} AppColGroupDef
 * @property {(AppColDef | AppColGroupDef)[]} children
 */

/**
 * Structure i18n
 * @typedef TypeI18n
 * @property {Object} administreDetails
 * @property {Object} avisAdministre
 * @property {Object} avisPoste
 * @property {Object} decision
 * @property {Object} etatFeFmob
 * @property {Object} global
 * @property {Object} profil
 */

/**
 * Paramètres communs des managers
 * @readonly
 * @typedef ParamsManager
 * @property {?number} page
 * @property {?number} pageSize
 */
export {};
