from django.test import TestCase
from django.urls import reverse
from rest_framework import status
import pandas as pd
from rest_framework.test import APIClient, APITestCase
from ...utils_extraction import to_table_pam

from ...models import (Administre, CustomUser, Decision, DecisionChoices,
                       Domaine, Filiere, FormationEmploi, Garnison, Poste,
                       RefGest, RefOrg, RefSvFil, SousVivier, Administres_Pams, Postes_Pams, PAM)

import datetime



class PamTestCase(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.date = datetime.date(2023,1,1)
        cls.pam_2022 = PAM.objects.create(pam_id='2022',pam_date=datetime.date(2022,7,15), pam_libelle= "PAM de l'année 2022", pam_statut='PAM en cours')
        cls.pam_2023 = PAM.objects.create(pam_id='2023',pam_date=datetime.date(2022,7,15), pam_libelle= "PAM de l'année 2023", pam_statut='PAM A+1')


    def test_extraction_pam(self):
        """
        Construit la table PAM qui servira à récuperer l'année du PAM et piloter l'affichage des données en fonction du bon pam pour chaque tables
        Cloture le PAM en le sauvegardant dans un fichier excel
        """
        annee_pam = str(self.date.year)
        annee_pam_suivant = str(self.date.year + 1)

        pam=pd.DataFrame(columns = ['pam_id','pam_date', 'pam_libelle','pam_statut'])
        pam_id = annee_pam
        pam_id_suivant = annee_pam_suivant
        pam_libelle = f"PAM de l'année {annee_pam}"
        pam_libelle_suivant = f"PAM de l'année {annee_pam_suivant}"
        pam_date = self.date
        pam_date_suivant = pam_date
        pam_statut = "PAM en cours"
        pam_statut_suivant = "PAM A+1"

        sorg_id = "SORG"
        sorg_libelle = "SORG"
        sorg_statut = "SORG"

        pam['pam_id'] = [pam_id,pam_id_suivant, sorg_id]
        pam['pam_date'] = [pam_date,pam_date_suivant, pam_date]
        pam['pam_libelle'] = [pam_libelle,pam_libelle_suivant,sorg_libelle]
        pam['pam_statut'] = [pam_statut,pam_statut_suivant,sorg_statut]
        
        return pam


    def test_insertion_pam(self):
        self.liste_create = []
        self.liste_update = []
        self.update_header = ['pam_date','pam_libelle','pam_statut']
        self.df = self.test_extraction_pam()
        for i in range(self.df.shape[0]):
            self.pams = PAM.objects.filter(pam_id=self.df.at[i,'pam_id'])
            self.pam = PAM(pam_id=self.df.at[i, 'pam_id'],pam_date=self.df.at[i, 'pam_date'], pam_libelle=self.df.at[i, 'pam_libelle'],
                    pam_statut=self.df.at[i, 'pam_statut'])

            if self.pam.pam_id in self.pams.values_list('pam_id', flat = True):
                self.liste_update.append(self.pam)
            else:
                cloture=PAM.objects.filter(pam_statut="PAM en cours")
                cloture.update(pam_statut ="PAM clôturé")
                self.liste_create.append(self.pam)

        if self.liste_create:
            PAM.objects.bulk_create(self.liste_create)
        if self.liste_update:
            PAM.objects.bulk_update(self.liste_update, fields=self.update_header)
