import re
import requests

from .config import getDockersConfig, getSecretConfig

paheko_ident = getSecretConfig("paheko", "API_USER")
paheko_pass = getSecretConfig("paheko", "API_PASSWORD")
paheko_auth = (paheko_ident, paheko_pass)
paheko_url = f"https://kaz-paheko.{getDockersConfig('domain')}"

class Paheko:
    def get_categories(self):
        """
        Récupérer les catégories Paheko avec le compteur associé
        """
        api_url = paheko_url + '/api/user/categories'

        response = requests.get(api_url, auth=paheko_auth)

        if response.status_code == 200:
            data = response.json()
            return data
        else:
            return None


    def get_categorie_id(self, categorie_name):
        categories = self.get_categories()
        for categorie in categories.values():
            if categorie["name"] == categorie_name:
                return categorie["id"]
        return None


    def get_users_in_categorie(self,categorie):
        """
        Afficher les membres d'une catégorie Paheko
        """
        if not (isinstance(categorie, int) or categorie.isdigit()):
            return 'Id de category non valide', 400

        api_url = f"{paheko_url}/api/user/category/{categorie}.json"

        response = requests.get(api_url, auth=paheko_auth)

        if response.status_code == 200:
            data = response.json()
            return data
        else:
            return None


    def get_user(self,ident):
        """
        Afficher un membre de Paheko par son email kaz ou son numéro ou le non court de l'orga
        """

        emailmatchregexp = re.compile(r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")

        if emailmatchregexp.match(ident):
          data = { "sql": f"select * from users where email='{ident}' or alias = '{ident}'" }
          api_url = paheko_url + '/api/sql/'
          response = requests.post(api_url, auth=paheko_auth,  data=data)
          #TODO: if faut Rechercher count et vérifier que = 1 et supprimer le count=1 dans la réponse
        elif  ident.isdigit():
          api_url = paheko_url + '/api/user/'+ident
          response = requests.get(api_url, auth=paheko_auth)
        else:
          nomorga = re.sub(r'\W+', '', ident) # on vire les caractères non alphanumérique
          data = { "sql": f"select * from users where admin_orga=1 and nom_orga='{nomorga}'" }
          api_url = paheko_url + '/api/sql/'
          response = requests.post(api_url, auth=paheko_auth,  data=data)
          #TODO:if faut Rechercher count et vérifier que = 1  et supprimer le count=1 dans la réponse

        if response.status_code == 200:
            data = response.json()
            if data["count"] == 1:
                 return data["results"][0]
            elif data["count"] == 0:
                 return None
            else:
                 return data["results"]
        else:
            return None


    def set_user(self,ident,field,new_value):
        """
        Modifie la valeur d'un champ d'un membre paheko (ident= numéro paheko ou email kaz)
        """

        #récupérer le numero paheko si on fournit un email kaz
        emailmatchregexp = re.compile(r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")
        if emailmatchregexp.match(ident):
          data = { "sql": f"select id from users where email='{ident}'" }
          api_url = paheko_url + '/api/sql/'
          response = requests.post(api_url, auth=paheko_auth, data=data)
          if response.status_code == 200:
              #on extrait l'id de la réponse
              data = response.json()
              if data['count'] == 0:
                print("email non trouvé")
                return None
              elif data['count'] > 1:
                  print("trop de résultat")
                  return None
              else:
                #OK
                ident = data['results'][0]['id']
          else:
              print("pas de résultat")
              return None
        elif not ident.isdigit():
           print("Identifiant utilisateur invalide")
           return None

        regexp = re.compile("[^a-zA-Z0-9 \\r\\n\\t" + re.escape(string.punctuation) + "]")
        valeur = regexp.sub('',new_value) # mouais, il faudrait être beaucoup plus précis ici en fonction des champs qu'on accepte...

        champ = re.sub(r'\W+','',field) # pas de caractères non alphanumériques ici, dans l'idéal, c'est à choisir dans une liste plutot

        api_url = paheko_url + '/api/user/'+str(ident)
        payload = {champ: valeur}
        response = requests.post(api_url, auth=paheko_auth, data=payload)
        return response.json()


    def get_users_with_action(self, action):
        """
        retourne tous les membres de paheko avec une action à mener (création du compte kaz / modification...)
        """

        api_url = paheko_url + '/api/sql/'
        payload = { "sql": f"select * from users where action_auto='{action}'" }
        response = requests.post(api_url, auth=paheko_auth,  data=payload)

        if response.status_code == 200:
            return response.json()
        else:
            return None


