from resources.common_imports import *

#les variables globales minimum
from resources.config import site_url, webmail_url, mdp_url


class Kaz_user(Resource):

    def __init__(self):
        global sympa_liste_info
        
        self.paheko_users_action_resource = Paheko_users_action()
        self.paheko_user_resource=Paheko_user()
        self.ldap_user_resource = Ldap_user()
        self.password_create_resource = Password_create()        
        self.mattermost_message_resource=Mattermost_message()
        self.mattermost_user_resource=Mattermost_user()
        self.mattermost_user_team_resource=Mattermost_user_team()
        self.mattermost_user_channel_resource=Mattermost_user_channel()
        self.mattermost_team_resource=Mattermost_team()                
        self.sympa_user_resource=Sympa_user()
        

#********************************************************************************************
    @jwt_required()
    def delete(self):
        """
        Utile pour les tests de createUser. Avant le POST de /kaz/create/users. Ça permet de supprimer/maj les comptes.
        ---
        tags:
          - Kaz User
        security:
          - Bearer: []                
        parameters: []
        responses:
            201:
                description: Succès        
            401: 
                description: Oops, un soucis quelconque
        """      
        #verrou pour empêcher de lancer en même temps la même api          
        try:
          prefixe="del_user_lock_"
          if glob(f"{tempfile.gettempdir()}/{prefixe}*"): raise ValueError("ERREUR 0 : api déjà en cours d'utilisation !")
          lock_file = tempfile.NamedTemporaryFile(prefix=prefixe,delete=True)
        
          #TODO à remplir à la main
          liste_emails=["",""]
          email_secours=""
          liste_sympa=""
          
          for email in liste_emails:
            res, status_code = self.ldap_user_resource.delete(email)
            res, status_code = self.mattermost_user_resource.delete(email)
            nom_orga=''.join(random.choice(string.ascii_lowercase) for _ in range(8))                        
            res, status_code = self.paheko_user_resource.put(email,"nom_orga",nom_orga)
            res, status_code = self.paheko_user_resource.put(email,"action_auto","A créer")
            res, status_code = self.paheko_user_resource.put(email,"email_secours",email_secours)
            res, status_code = self.sympa_user_resource.delete(email,liste_sympa)
            res, status_code = self.sympa_user_resource.delete(email_secours,liste_sympa)
            msg=f"**POST AUTO** suppression de {email} ok"
            self.mattermost_message_resource.post(message=msg)          
          return "OK", 200

        except ValueError as e:
          msg=f"(classe: {__class__.__name__} : {e}"
          self.mattermost_message_resource.post(message=msg)
          return str(msg), 401
        
#********************************************************************************************

    @jwt_required()
    def post(self):
        """
        Créé un nouveau kaznaute: inscription sur MM / Cloud / email + msg sur MM + email à partir de action="a créer" sur paheko
        ---
        tags:
          - Kaz User
        security:
          - Bearer: []                
        parameters: []
        responses:
            201:
                description: Succès, kaznaute créé        
            400: 
                description: Oops, rien à créer
            401: 
                description: Oops, un soucis quelconque
        """
        
        try:

          #verrou pour empêcher de lancer en même temps la même api          
          prefixe="create_user_lock_"
          if glob(f"{tempfile.gettempdir()}/{prefixe}*"): raise ValueError("ERREUR 0 : api déjà en cours d'utilisation !")
          lock_file = tempfile.NamedTemporaryFile(prefix=prefixe,delete=True)
         
          #qui sont les kaznautes à créer ?   
          liste_kaznautes, status_code = self.paheko_users_action_resource.get("A créer")
          
          if liste_kaznautes=="pas de résultat": return "ERREUR: paheko non joignable",401
          
          count=liste_kaznautes['count']
          if count==0: return "aucun nouveau kaznaute à créer",400
          
          #au moins un kaznaute à créer
          for tab in liste_kaznautes['results']:          
            email = tab['email'].lower() 
                     
            # est-il déjà dans le ldap ? (mail ou alias)          
            res, status_code = self.ldap_user_resource.get(email)         
            if status_code != 400: raise ValueError(f"ERREUR 1: {email} déjà existant dans ldap. {res}, on arrête tout")
            
            #test nom orga
            if tab['admin_orga'] == 1:
              if tab['nom_orga'] is None: 
                raise ValueError(f"ERREUR 0 sur paheko: {email} : nom_orga vide, on arrête tout")
              if not bool(re.match(r'^[a-z0-9-]+$', tab['nom_orga'])):
                raise ValueError(f"ERREUR 0 sur paheko: {email} : nom_orga ({tab['nom_orga']}) incohérent (minuscule/chiffre/-), on arrête tout")
                      
            #test email_secours
            email_secours = tab['email_secours'].lower()
            if not validate_email(email_secours): raise EmailNotValidError()

            #test quota
            quota = tab['quota_disque']
            if not quota.isdigit(): raise ValueError(f"ERREUR 2: quota non numérique : {quota}, on arrête tout")
          
            #quel type de test ?
            #"nom": "ROUSSEAU Mickael",
            nom, prenom = tab['nom'].split(maxsplit=1)
            
            #on génère un password
            password,status_code = self.password_create_resource.get()
          
            #on créé dans le ldap
            #à quoi servent prenom/nom dans le ldap ?
            data = {
              "prenom": prenom,
              "nom": nom,
              "password": password,
              "email_secours": email_secours,
              "quota": quota
            }            
            res, status_code = self.ldap_user_resource.put(email, **data)
            if status_code != 200: raise ValueError(f"ERREUR 3 sur ldap: {email} : {res}, on arrête tout ")
            
            #on créé dans MM 
            user = email.split('@')[0]
            res, status_code = self.mattermost_user_resource.post(user,email,password)
            if status_code != 200: raise ValueError(f"ERREUR 4 sur MM: {email} : {res}, on arrête tout ")
                      
            # et on affecte à l'équipe kaz
            res, status_code = self.mattermost_user_team_resource.post(email,"kaz")
            if status_code != 200: raise ValueError(f"ERREUR 5 sur MM: {email} : {res}, on arrête tout ")
          
            #et aux 2 canaux de base
            res, status_code = self.mattermost_user_channel_resource.post(email,"kaz","une-question--un-soucis")
            if status_code != 200: raise ValueError(f"ERREUR 6 sur MM: {email} : {res}, on arrête tout ")
            res, status_code = self.mattermost_user_channel_resource.post(email,"kaz","cafe-du-commerce--ouvert-2424h")
            if status_code != 200: raise ValueError(f"ERREUR 7 sur MM: {email} : {res}, on arrête tout ")
                        
            #on créé une nouvelle équipe ds MM si besoin
            if tab['admin_orga'] == 1:
              res, status_code = self.mattermost_team_resource.post(tab['nom_orga'],email)
              if status_code != 200: raise ValueError(f"ERREUR 8 sur MM: {email} : {res}, on arrête tout ")            
              #BUG: créer la nouvelle équipe n'a pas rendu l'email admin, on le rajoute comme membre simple
              res, status_code = self.mattermost_user_team_resource.post(email,tab['nom_orga'])
              if status_code != 200: raise ValueError(f"ERREUR 8.1 sur MM: {email} : {res}, on arrête tout ")
            
            #on créé dans le cloud genéral
            #inutile car tous les user du ldap sont user du cloud général.
            
            #on inscrit email et email_secours à la nl sympa_liste_info
            res, status_code = self.sympa_user_resource.post(email,sympa_liste_info)
            if status_code != 200: raise ValueError(f"ERREUR 9 sur Sympa: {email} : {res}, on arrête tout ")          
            res, status_code = self.sympa_user_resource.post(email_secours,sympa_liste_info)
            if status_code != 200: raise ValueError(f"ERREUR 10 sur Sympa: {email_secours} : {res}, on arrête tout ")
          
            #on construit/envoie le mail
            context = {
            'ADMIN_ORGA': tab['admin_orga'], 
            'NOM': tab['nom'],
            'EMAIL_SOUHAITE': email,
            'PASSWORD': password,
            'QUOTA': tab['quota_disque'],
            'URL_WEBMAIL': webmail_url,
            'URL_AGORA': mattermost_url,
            'URL_MDP': mdp_url,
            'URL_LISTE': sympa_url,
            'URL_SITE': site_url,
            'URL_CLOUD': cloud_url
            }                  
            subject="KAZ: confirmation d'inscription !"
            sender=app.config['MAIL_USERNAME']
            reply_to = app.config['MAIL_REPLY_TO']
            msg = Message(subject=subject, sender=sender, reply_to=reply_to, recipients=[email,email_secours])
            msg.html = render_template('email_inscription.html', **context)        
            mail.send(msg)
            
            #on met le flag paheko action à Aucune
            res, status_code = self.paheko_user_resource.put(email,"action_auto","Aucune")
            if status_code != 200: raise ValueError(f"ERREUR 12 sur paheko: {email} : {res}, on arrête tout ")            
          
            #on post sur MM pour dire ok
            msg=f"**POST AUTO** Inscription réussie pour {email} avec le secours {email_secours} Bisou!"
            self.mattermost_message_resource.post(message=msg)
                                    
          return "fin des inscriptions", 201
        
        except EmailNotValidError as e:
          msg=f"classe: {__class__.__name__} : ERREUR 13 : email_secours : {email_secours} " + str(e) +", on arrête tout"
          self.mattermost_message_resource.post(message=msg)             
          return msg, 401
        except ValueError as e:
          msg=f"(classe: {__class__.__name__} : {e}"
          self.mattermost_message_resource.post(message=msg)
          return str(msg), 401
        

#*************************************************