from resources.common_imports import *

#les variables globales minimum
from resources.config import mattermost_user, mattermost_pass, mattermost_url

# on utilise mmctl et pas l'apiv4 de MM
# pourquoi ? passe que mmctl déjà utilisé dans les scripts kaz. 

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

def Mattermost_authenticate():
     # Authentification sur MM
     global mattermost_url, mattermost_user, mattermost_pass
     cmd = f"/mm/mmctl auth login {mattermost_url} --name local-server --username {mattermost_user} --password {mattermost_pass}"
     subprocess.run(cmd, shell=True, stderr=subprocess.STDOUT, check=True)

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

class Mattermost_message(Resource):

    @jwt_required()
    def post(self,message,equipe="kaz",canal="creation-comptes"):
        """
        Envoyer un message dans une Equipe/Canal de MM
        ---
        tags:
          - Mattermost        
        security:
          - Bearer: []                
        parameters:
          - in: path
            name: equipe
            type: string
            required: true
          - in: path
            name: canal
            type: string
            required: true
          - in: path
            name: message
            type: string
            required: true
        
        responses:
            200:
                description: Affiche un message dans un canal d'une équipe
            500:
                description: oops
        """    
        Mattermost_authenticate()
    
        try:
            cmd="/mm/mmctl post create "+equipe+":"+canal+" --message "+ "\"" + message + "\""
            output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
            return "Message envoyé", 200
        except subprocess.CalledProcessError:
            return "Message non envoyé", 500


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

class Mattermost_user(Resource):
  
    def __init__(self):
      Mattermost_authenticate()
  
#*************************************************  
    @jwt_required()
    def get(self,user):
        """
        Le user existe t-il sur MM ? 
        ---
        tags:
          - Mattermost User
        security:
          - Bearer: []                
        parameters: 
          - in: path
            name: user
            type: string
            required: true        
            description: possible d'entrer un username, un email
        responses:
            200:
                description: Existe
            404:
                description: N'existe pas
        """    
            
        try:
            cmd = f"/mm/mmctl user search {user} --json"
            user_list_output = subprocess.check_output(cmd, shell=True)
            return 200  # Le nom d'utilisateur existe
        except subprocess.CalledProcessError:
            return 404  # Le nom d'utilisateur n'existe pas

#*************************************************
    @jwt_required()
    def post(self,user,email,password):
        """
        Créer un utilisateur sur MM
        ---
        tags:
          - Mattermost User
        security:
          - Bearer: []                
        parameters: 
          - in: path
            name: user
            type: string
            required: true        
          - in: path
            name: email
            type: string
            required: true        
          - in: path
            name: password
            type: string
            required: true        
        responses:
            200:
                description: Utilisateur créé
            400:
                description: oops, Utilisateur non créé
        """        
        
       # Création de l'utilisateur
        try:
            cmd = f"/mm/mmctl user create --email {email} --username {user} --password {password}"
            output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
            return output.decode("utf-8"), 200

        except subprocess.CalledProcessError as e:
            return e.output.decode("utf-8"), 400

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

    @jwt_required()
    def delete(self,email):
        """
        Supprimer un utilisateur sur MM
        ---
        tags:
          - Mattermost User
        security:
          - Bearer: []                
        parameters: 
          - in: path
            name: email
            type: string
            required: true        
        responses:
            200:
                description: Utilisateur supprimé
            400:
                description: oops, Utilisateur non supprimé
        """        
        
        try:
            cmd = f"/mm/mmctl user delete {email} --confirm"
            output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
            return output.decode("utf-8"), 200

        except subprocess.CalledProcessError as e:
            return e.output.decode("utf-8"), 400

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

    @jwt_required()
    def put(self,email,new_password):
        """
        Changer un password pour un utilisateur de MM
        ---
        tags:
          - Mattermost User
        security:
          - Bearer: []                
        parameters: 
          - in: path
            name: email
            type: string
            required: true        
          - in: path
            name: new_password
            type: string
            required: true        
        responses:
            200:
                description: Mot de passe de l'Utilisateur changé
            400:
                description: oops, Mot de passe de l'Utilisateur inchangé
        """        
        try:
            cmd = f"/mm/mmctl user change-password {email} --password {new_password}"
            output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
            return output.decode("utf-8"), 200 

        except subprocess.CalledProcessError as e:
            return e.output.decode("utf-8"), 400

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

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

class Mattermost_user_team(Resource):
  
    @jwt_required()
    def post(self,email,equipe):
        """
        Affecte un utilisateur à une équipe MM
        ---
        tags:
          - Mattermost Team       
        security:
          - Bearer: []        
        parameters: 
          - in: path
            name: email
            type: string
            required: true        
          - in: path
            name: equipe
            type: string
            required: true        
        responses:
            200:
                description: l'utilisateur a bien été affecté à l'équipe
            400:
                description: oops, Utilisateur non affecté
        """
        Mattermost_authenticate()
        
        try:
            cmd = f"/mm/mmctl team users add {equipe} {email}"
            output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
            return output.decode("utf-8"), 200 

        except subprocess.CalledProcessError as e:
            return e.output.decode("utf-8"), 400 


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

class Mattermost_user_channel(Resource):
    @jwt_required()
    def post(self,email,equipe,canal):
        """
        Affecte un utilisateur à un canal MM
        ---
        tags:
          - Mattermost        
        security:
          - Bearer: []                
        parameters: 
          - in: path
            name: email
            type: string
            required: true        
          - in: path
            name: equipe
            type: string
            required: true                
          - in: path
            name: canal
            type: string
            required: true        
        responses:
            200:
                description: l'utilisateur a bien été affecté au canal
            400:
                description: oops, Utilisateur non affecté
        """
        Mattermost_authenticate()
        
        try:
            cmd = f'/mm/mmctl channel users add {equipe}:{canal} {email}'
            output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
            return output.decode("utf-8"), 200

        except subprocess.CalledProcessError as e:
            return e.output.decode("utf-8"), 400


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

class Mattermost_team(Resource):
  
    def __init__(self):
      Mattermost_authenticate()
      
#*************************************************  

    @jwt_required()
    def get(self):
        """
        Lister les équipes sur MM 
        ---
        tags:
          - Mattermost Team   
        security:
          - Bearer: []                
        parameters: []
        responses:
            200:
                description: liste des équipes
            400:
                description: oops, Equipe non supprimée
        """        
        Mattermost_authenticate()
        
        try:
            cmd = f"/mm/mmctl team list --disable-pager"
            output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)                                    
            data_list = output.decode("utf-8").strip().split('\n')            
            data_list.pop()
            return data_list, 200
            #return jsonify(data_list),200

        except subprocess.CalledProcessError as e:
            return e.output.decode("utf-8"), 400

#*************************************************  
    @jwt_required()
    def post(self,equipe,email):
        """
        Créer une équipe sur MM et affecter un admin si email est renseigné (set admin marche pô)
        ---
        tags:
          - Mattermost Team        
        security:
          - Bearer: []                
        parameters: 
          - in: path
            name: equipe
            type: string
            required: true        
          - in: path
            name: email
            type: string
            required: true
            description: admin de l'équipe
        responses:
            200:
                description: Equipe créée
            400:
                description: oops, Equipe non créée
        """                
        
        try:
            #DANGER: l'option --email ne rend pas le user admin de l'équipe comme c'est indiqué dans la doc :(
            cmd = f"/mm/mmctl team create --name {equipe} --display-name {equipe} --private --email {email}"
            output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
            
            #Workaround: on récup l'id du user et de l'équipe pour affecter le rôle "scheme_admin": true, "scheme_user": true avec l'api MM classique.
            #TODO:
            
            return output.decode("utf-8"), 200

        except subprocess.CalledProcessError as e:
            return e.output.decode("utf-8"), 400
          
#*************************************************
    @jwt_required()
    def delete(self,equipe):
        """
        Supprimer une équipe sur MM 
        ---
        tags:
          - Mattermost Team        
        security:
          - Bearer: []        
        parameters: 
          - in: path
            name: equipe
            type: string
            required: true        
        responses:
            200:
                description: Equipe supprimée
            400:
                description: oops, Equipe non supprimée
        """        
        Mattermost_authenticate()
        
        try:
            cmd = f"/mm/mmctl team delete {equipe} --confirm"
            output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)                        
            return output.decode("utf-8"), 200

        except subprocess.CalledProcessError as e:
            return e.output.decode("utf-8"), 400
          
#*************************************************