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 postes, via l'API REST.
 * @class
 */
export default class PostesManager extends AbstractDataManager {
    //
    static ENDPOINT_DEFAUT = 'postes_pams';

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

    /**
     * Retourne une liste de tous les postes 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(PostesManager.ENDPOINT_DEFAUT, params);
        return axios.get(url, params);
    }

    /**
     * Retourne un poste d'id donné
     *
     * @param {import('../jsdoc/api').IdPosteApi} id - ID du poste
     * @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(PostesManager.ENDPOINT_DEFAUT + '/' + id, params);
        return axios.get(url, params);
    }

    /**
     * Met à jour les informations concernant un poste.
     *
     * @param {import('../jsdoc/api').IdPosteApi} id - ID du poste
     * @param {*} data
     */
    async update(id, data) {
        console.log('PostesManager update', id, data);

        const url = this.buildPatchURL(PostesManager.ENDPOINT_DEFAUT, id);
        let newData = {};
        for (const [key, value] of Object.entries(data)) {
            if (key.includes('ponderations')) {
                newData[key.replace('ponderations_', 'p_poids_')] = value;
            } else {
                newData[key] = value;
            }
        }
        return axios.patch(url, newData);
    }

    /**
     * Met à jour les informations concernant plusieurs postes à la fois, en remplaçant les données correspondantes.
     *
     * @param {import('../jsdoc/api').IdPosteApi[]} ids - IDs des postes
     * @param {*} data
     */
    async updateMultiple(ids, data, pam_id) {

        const url = this.buildPutURL(PostesManager.ENDPOINT_DEFAUT);
        return axios.put(
            url,
            ids.map((id) => ({ p_id: id, ...data, pam_id}))
        );
    }

    /**
     * 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(PostesManager.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(
            PostesManager.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(
            PostesManager.ENDPOINT_DEFAUT,
            Array.isArray(idsFe) ? { ...params, formation_emploi__in: idsFe } : params
        );
    }

    /**
     * Retourne une url l'appel API pour obtenir les N meilleurs administrés sur un poste donné
     *
     * @param {import('../jsdoc/api').IdPosteApi} id - ID du poste
     * @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, poste_id: id });
    }

    /**
     * Retourne une url l'appel API pour obtenir la décision sur un poste donné
     *
     * @param {import('../jsdoc/api').IdPosteApi} id - ID du poste
     * @returns {string} - url
     */
    buildDecisionFetchKey(id, params) {
        return this.buildFetchURL(DecisionManager.DECISION_ENDPOINT, { poste_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').IdPosteApi} id - ID du poste
     * @param {?import('../jsdoc/types').ParamsManager} params - paramètres d'appel
     * @returns {string} - url
     */
     buildGetCallKey(id, params) {
        return this.buildFetchURL(PostesManager.ENDPOINT_DEFAUT + '/' + id, params);
    }

}
