import { cssMenu } from '../../../../constantes/classes-css';
import AppConfigStore from '../../../../stores/AppConfigStore';

/**
 * Bibliothèque de fonctions utilitaires pour les listes AG Grid d'Ogure NG.
 *
 * @module
 */

/**
 * Suppression des éventuels doubles séparateurs ou séparateurs en début ou fin de menu contextuel.
 *
 * @param {Array.<Object>} menuItems - Liste des éléments du menu
 */
export function supprimeSeparateursSurnumerairesMenuContextuel(menuItems) {
    if (menuItems && menuItems[0] === 'separator') {
        menuItems.splice(0, 1);
    }
    if (menuItems && menuItems[menuItems.length - 1] === 'separator') {
        menuItems.splice(menuItems.length - 1, 1);
    }
    for (var i = 1; i < menuItems.length; ) {
        if (menuItems[i] === 'separator' && menuItems[i - 1] === 'separator') {
            menuItems.splice(i, 1);
        } else {
            i++;
        }
    }
}

/**
 * Ajoute au menu contextuel les éléments communs à un administré : titre du menu contextuel + accès à la fiche détaillée
 * @param {Array.<Object>} menuItems - Liste des éléments du menu
 * @param {*} administreDataNode - Noeud data AG Grid pour l'administré
 * @param {AppConfigStore} appConfig - store
 * @param {Array.<string>} extraClassNames - classe CSS supplémentaire éventuelle
 */
export function ajouteElementsCommunsAdministreAMenuContextuel(menuItems, administreDataNode, appConfig, extraClassNames = undefined) {
    menuItems.push(
        {
            name: '<span>' + administreDataNode.identite_grade_nom_prenom + '</span>',
            disabled: true,
            cssClasses: [...['titreMenuContextuel', 'administre'], ...(extraClassNames || [])]
        },
        {
            name: 'Consulter la fiche détaillée de cet administré',
            action: () => appConfig.actionsMetierHelper.afficherFicheDetailleeAdministre(administreDataNode.id, appConfig),
            cssClasses: [cssMenu.svgIcon, 'ficheDetaillee']
        }
    );
}

/**
 * Ajoute au menu contextuel les éléments communs à un poste : titre du menu contextuel
 * @param {Array.<Object>} menuItems - Liste des éléments du menu
 * @param {*} posteDataNode - Noeud data AG Grid pour l'administré
 * @param {*} appConfig - store
 * @param {Array.<string>} extraClassNames - classe CSS supplémentaire éventuelle
 */
export function ajouteElementsCommunsPosteAMenuContextuel(menuItems, posteDataNode, appConfig, extraClassNames = undefined) {
    if (menuItems.length > 1) {
        menuItems.push('separator');
    }
    menuItems.push({
        name: '<span>' + posteDataNode.libelleGroupe + '</span>',
        disabled: true,
        cssClasses: [...['titreMenuContextuel', 'poste'], ...(extraClassNames || [])]
    });
}

/**
 * Ajoute les éléments communs à tous les menus contextuels : Copier ; Copier avec entêtes ; Exporter
 * @param {Array.<Object>} menuItems - Liste des éléments du menu
 */
export function ajouteElementsCommunsAMenuContextuel(menuItems) {
    // --- Eléments communs à tous les menus contextuels
    if (menuItems.length > 1) {
        menuItems.push('separator');
    }

    menuItems.push('copy', 'copyWithHeaders', 'export', 'resetColumns');
}

/**
 * Rend visible la première ligne sélectionnée de la liste.
 * @param {*} selectedRows - Liste des lignes sélectionnées
 * @param {*} gridApi - API
 */
export function ensureVisibleFirstSelectedRow(selectedRows, gridApi) {
    let firstRowIndex = null;
    for (let row of selectedRows) {
        const node = gridApi.getRowNode(row.id);
        if (node) {
            firstRowIndex = firstRowIndex === null ? node.rowIndex : Math.min(firstRowIndex, node.rowIndex);
        }
    }
    if (firstRowIndex !== null) {
        gridApi.ensureIndexVisible(firstRowIndex, 'middle');
    }
}
