# -*- coding: utf-8 -*-
# #
# refpypmsi - Implémentation en python de refpmsi
# @https://github.com/denisGustin/refpmsi refpmsi est un package crée par denisGustin
# Ce package est sous license GPL
# #

import os
import pandas as pd

chemin_module = os.path.dirname(os.path.abspath(__file__))

def refpypmsi (referentiel = '', periodepmsi = '', ignorer_periode_manquante = True):

    '''
        referentiel - fonction de récupération d'un référenciel

        inputs :
            referentiel, str : nom du référentiel à extraire, la liste des référentiels disponibles est accessible par la commande liste_refpypmsi
            periodepmsi, int : année du référentiel, si l'année n'existe pas où le référentiel n'est pas daté, l'année est ignoré et l'ensemble des données sont retournés. Ce comportement peut être modifié à l'aide de l'option ignorer_periode_manquante.
            ignorer_periode_manquante, boolean : si False, une erreur est renvoyé lorsque l'année sélectionnée n'existe pas, autrement, aucune l'erreur est ignoré et l'ensemble des données disponibles sont renvoyés.

        output :
            Pandas Dataframe : dataframe contenant le référentiel sélectionné
    '''
    
    chemin_refentiel = "/".join([
        chemin_module,
        'inst/referentiels',
        referentiel+".json.gz"
    ])

    if (os.path.exists(chemin_refentiel) == False):
        # Déclenchement de l'erreur
        if referentiel != 'liste_refpmsi':
             # Referentiels attendus
            liste_referentiels = liste_refpypmsi()
            
            raise Exception("Référentiel invalide. Devrait être l'un des suivants : {}".format(
                ", ".join(liste_referentiels)
            ))
        else:
            raise Exception("Liste de référentiels inexistante, essayez de ré-installer le package.")


    # Chargement du référentiel
    donnees_referentiel = pd.read_json(chemin_refentiel)

    # Filtre par année quand nécessaire
    if (periodepmsi != ''):
        if type(periodepmsi) != type(list()):
            periodepmsi = [periodepmsi] # On s'assure que c'est une liste
        periodepmsi = [int(x) for x in periodepmsi] # On s'assure que c'est du int

        if (('anpmsi' not in donnees_referentiel.columns) or (sum(donnees_referentiel["anpmsi"].isin(periodepmsi)) > 0)):
            donnees_referentiel = donnees_referentiel[donnees_referentiel["anpmsi"].isin(periodepmsi)] \
                                    .reset_index(drop = True)
        else:
            if ignorer_periode_manquante == False:
                raise Exception("Année de référentiel invalide.")

    # On retourne le référentiel
    return(donnees_referentiel)

def liste_refpypmsi():
    '''
        liste_refpypmsi - Fonction qui renvoie la liste des référentiels existants

        output :
            Pandas Dataframe : dataframe contenant la liste des référentiels existants
    '''
    
    liste_referentiels = refpypmsi("liste_refpmsi")

    return(liste_referentiels)

def refpmsi(referentiel = '', periodepmsi = '', ignorer_periode_manquante = True, chemin = ''):
    return refpypmsi(referentiel=referentiel, periodepmsi=periodepmsi, ignorer_periode_manquante=ignorer_periode_manquante)

def liste_refpmsi():
    return liste_refpypmsi()
