from resources.common_imports import *

#les variables globales minimum
from resources.config import sympa_ident, sympa_pass, sympa_url, sympa_liste_info, MAIL_USERNAME


class Sympa_user(Resource):
    def __init__(self):
        global sympa_ident, sympa_pass, sympa_url,MAIL_USERNAME
        self.sympa_ident = sympa_ident
        self.sympa_pass = sympa_pass
        self.sympa_url = sympa_url

    def _execute_sympa_command(self, email, liste, service):
        try:
            if validate_email(email) and validate_email(liste):
                cmd = f'export PERL5LIB=/usr/src/app/:$PERL5LIB && /usr/src/app/Sympa/sympa_soap_client.pl --soap_url={self.sympa_url}/sympasoap --trusted_application={self.sympa_ident} --trusted_application_password={self.sympa_pass} --proxy_vars=USER_EMAIL={MAIL_USERNAME} --service={service} --service_parameters="{liste},{email}" && echo $?'
                output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
                return output.decode("utf-8"), 200  # Retourne la sortie et un code de succès
        except EmailNotValidError as e:
            return str(e), 400  # Retourne le message d'erreur et un code d'erreur 400
        except subprocess.CalledProcessError as e:
            return e.output.decode("utf-8"), 400  # Retourne la sortie de la commande et un code d'erreur 400

    @jwt_required()
    def post(self, email, liste):
        """
        Ajouter un email dans une liste sympa
        ---
        tags:
          - Sympa
        security:
          - Bearer: []                
        parameters:
          - in: path
            name: email
            type: string
            required: true
          - in: path
            name: liste
            type: string
            required: true
        responses:
            200:
                description: Succès, email ajouté dans la liste
            400:
                description: Oops, email non ajouté dans la liste
        """
        output, status_code = self._execute_sympa_command(email, liste, 'add')
        return output, status_code

    @jwt_required()
    def delete(self, email, liste):
        """
        Supprimer un email dans une liste sympa
        ---
        tags:
          - Sympa
        security:
          - Bearer: []                
        parameters:
          - in: path
            name: email
            type: string
            required: true
          - in: path
            name: liste
            type: string
            required: true
        responses:
            200:
                description: Succès, email supprimé dans la liste
            400:
                description: Oops, email non supprimé dans la liste
        """
        output, status_code = self._execute_sympa_command(email, liste, 'del')
        return output, status_code