import axios from 'axios';
import { isPresent } from '../helpers/objects';
import AppConfigStore from '../stores/AppConfigStore';
import AbstractDataManager from './AbstractDataManager';
import DecisionManager from './DecisionManager';

/**
 * Classe effectuant les opérations de chargement et mise à jour des données concernant les administrés, via l'API REST.
 * @class
 */
export default class AdministresManager extends AbstractDataManager {
    //
    static ENDPOINT_DEFAUT = 'administres_pams';
    static UPDATE_DECISION = 'decision';
    static UPDATE_INFO = 'administres_pams';
    static FICHE_DETAILLE_ENDPOINT = 'fiche_detaillee';

    /**
     * Constructeur
     * @constructor
     * @param {?AppConfigStore} appConfig
     */
    constructor(appConfig) {
        super(appConfig);
    }

    /**
     * Retourne une liste de tous les administrés correspondant aux paramètres fournis.
     *
     * @param {?import('../jsdoc/types').ParamsManager} params - paramètres d'appel
     * @returns {Promise<any>} - Promesse de résultats
     */
    async fetchAll(params) {
        const url = this.buildFetchURL(AdministresManager.ENDPOINT_DEFAUT, params);
        return axios.get(url, params);
    }

    /**
     * Retourne une url raccourcie de l'appel API de 'fetch'
     *
     * @param {?import('../jsdoc/types').ParamsManager} [params] - paramètres d'appel
     * @returns {string} - url
     */
    buildCallKey(params) {
        return this.buildFetchURL(AdministresManager.ENDPOINT_DEFAUT, params);
    }

    /**
     * Retourne une url raccourcie de l'appel API avec ses paramètres servant de clé pour cacher les données fetched
     *
     * @param {?import('../jsdoc/api').IdSousVivierApi} [idSousVivier] - Id du sous-vivier requêté ou vivier global. 0 si vivier Global
     * @param {?import('../jsdoc/types').ParamsManager} [params] - paramètres d'appel
     * @returns {string} - url
     */
    buildCallKeySousVivier(idSousVivier, params) {
        return this.buildFetchURL(
            AdministresManager.ENDPOINT_DEFAUT,
            isPresent(idSousVivier) ? { ...params, sous_vivier: idSousVivier.join('-') } : params );
    }

    /**
     * Retourne une url raccourcie de l'appel API avec ses paramètres servant de clé pour cacher les données fetched
     *
     * @param {?string[]} [idsFe] - IDs des formations-emplois requêtées
     * @param {?import('../jsdoc/types').ParamsManager} [params] - paramètres d'appel
     * @returns {string} - url
     */
    buildCallKeyFormationEmploi(idsFe, params) {
        return this.buildFetchURL(
            AdministresManager.ENDPOINT_DEFAUT,
            Array.isArray(idsFe) ? { ...params, formation_emploi__in: idsFe } : params
        );
    }

    /**
     * Retourne une url l'appel API pour obtenir les N meilleurs postes sur un administré donné
     *
     * @param {import('../jsdoc/api').IdAdministreApi} id - ID de l'administré
     * @param {?import('../jsdoc/types').ParamsManager} [params] - paramètres d'appel
     * @returns {string} - url du ranking
     */
    buildRankingFetchKey(id, params) {
        return this.buildFetchURL(AbstractDataManager.NOTATION_ENDPOINT, { ...params, administre_id: id });
    }

    /**
     * Retourne une url l'appel API pour obtenir la décision sur un administré donné
     *
     * @param {import('../jsdoc/api').IdAdministreApi} id - ID de l'administré
     * @returns {string} - url
     */
    buildDecisionFetchKey(id, params) {
        return this.buildFetchURL(DecisionManager.DECISION_ENDPOINT, { administre_id: id, ...params });
    }

    /**
     * Retourne une url raccourcie de l'appel API avec ses paramètres servant de clé pour cacher les données fetched
     *
     * @param {import('../jsdoc/api').IdAdministreApi} id - ID de l'administré
     * @param {?import('../jsdoc/types').ParamsManager} params - paramètres d'appel
     * @returns {string} - url
     */
    buildGetCallKey(id, params) {
        return this.buildFetchURL(AdministresManager.ENDPOINT_DEFAUT + '/' + id, params);
    }

    /**
     * Retourne une url de l'appel API de la fiche détaillée d'un administré
     *
     * @param {import('../jsdoc/api').IdAdministreApi} id - ID de l'administré
     * @returns {string} - url
     */
    buildFicheDetailleeCallKey(id, params) {
        return this.buildFetchURL(AdministresManager.FICHE_DETAILLE_ENDPOINT, { administre_id: id, ...params});
    }

    /**
     * Retourne un administré d'ID donné.
     *
     * @param {import('../jsdoc/api').IdAdministreApi} - ID de l'administré
     * @param {?import('../jsdoc/types').ParamsManager} params - paramètres d'appel
     * @returns {Promise<any>} - Promesse de résultats
     */
    async fetch(id, params) {
        const url = this.buildFetchURL(AdministresManager.ENDPOINT_DEFAUT + '/' + id, params);
        return axios.get(url, params);
    }

    /**
     * Met à jour les informations concernant un administré.
     *
     * @param {import('../jsdoc/api').IdAdministreApi} id - Id de l'administré
     * @param {*} data
     */
    async update(id, data, params) {
        console.log('AdministresManager update', id, data);
        const url = this.buildPatchURL(AdministresManager.ENDPOINT_DEFAUT, id, params);
        return axios.patch(url, data);
    }

    /**
     * Met à jour les informations concernant plusieurs administrés à la fois, en remplaçant les données correspondantes.
     *
     * @param {import('../jsdoc/api').IdAdministreApi[]} ids - IDs des administrés
     * @param {*} data
     * @param {*} pam_id
     */
    async updateMultiple(ids, data, pam_id) {
        // mutate(key, newData, false);
        console.log('AdministresManager updateMultiple', ids, data, pam_id);

        const url = this.buildPutURL(AdministresManager.ENDPOINT_DEFAUT);
        return axios.put(
            url,
            ids.map((id) => ({ a_id_sap: id, ...data, pam_id }))
        );
        //return Promise.all(administresIds.map((administreId) => this.update(administreId, data)));
    }

}
