import pyisemail
import py_module.docker as docker
from .base import Base
from .docker_installer import Docker_installer

class Mail(Base):

    def preload(self):
        self.logger.info('Проверяю наличие Docker-среды');
        with Docker_installer() as run:
            pass
        self.dockercli = docker.from_env();
        containers = self.dockercli.containers.list();
        for container in containers:
            if 'mail-server' in container.attrs.get('Config').get('Image') and container.status == 'running':
                self.mailcontainer = container

    def postload(self):
        getattr(self, self.action)()

    def is_valid_email(self, email):
        return pyisemail.is_email(address=email)

    def create_user(self):
        user=('',0)
        password=('',0)
        while user[0]=='' or password[0]=='':
            user=self.inputbox('Введите email')
            if not user[1]:
                self.logger.debug(f'Пользователь ввел: {user[0]}')
                if not self.is_valid_email(user[0]):
                    self.msgbox(f'Введенный email не соответствует стандарту именования. Введите корректный адрес.')
                    user=('',0)
                    continue
            else:
                return
            password = self.inputbox('Введите пароль почтового ящика')
            if not password[1]:
                self.logger.debug(f'Пользователь ввел: {password[0]}')
            else:
                return
        result=self.mailcontainer.exec_run(f'bash -c "/scripts/create_user.sh {user[0]} {password[0]}"')
        if result[0]!=0:
            self.logger.error(f'Произошла ошибка при создании почтового ящика {user}. Вывод: {result[1].decode("utf-8")}')
            self.msgbox(f'Произошла ошибка при создании почтового ящика:\n{result[1].decode("utf-8")}')
        else:
            self.logger.info(f'Пользователь создал почтовый ящик {user}. Вывод:: {result[1].decode("utf-8")}')
            self.msgbox(f'Почтовый ящик успешно создан.')

    def delete_user(self):
        user=('',0)
        while user[0]=='':
            user=self.inputbox('Введите email')
            if not user[1]:
                self.logger.debug(f'Пользователь ввел: {user[0]}')
                if not self.is_valid_email(user[0]):
                    self.msgbox(f'Введенный email не соответствует стандарту именования. Введите корректный адрес.')
                    user=('',0)
                    continue
            else:
                return
        result=self.mailcontainer.exec_run(f'bash -c "/scripts/delete_user.sh {user[0]}"')
        if result[0]!=0:
            self.logger.error(f'Произошла ошибка при удалении почтового ящика {user}. Вывод: {result[1].decode("utf-8")}')
            self.msgbox(f'Произошла ошибка при удалении почтового ящика:\n{result[1].decode("utf-8")}')
        else:
            self.logger.info(f'Пользователь удалил почтовый ящик {user}. Вывод:: {result[1].decode("utf-8")}')
            self.msgbox(f'Почтовый ящик успешно удален.')

    def change_password(self):
        user=('',0)
        password=('',0)
        while user[0]=='' or password[0]=='':
            user=self.inputbox('Введите email')
            if not user[1]:
                self.logger.debug(f'Пользователь ввел: {user[0]}')
                if not self.is_valid_email(user[0]):
                    self.msgbox(f'Введенный email не соответствует стандарту именования. Введите корректный адрес.')
                    user=('',0)
                    continue
            else:
                return
            password = self.inputbox('Введите новый пароль почтового ящика')
            if not password[1]:
                self.logger.debug(f'Пользователь ввел: {password[0]}')
            else:
                return
        result=self.mailcontainer.exec_run(f'bash -c "/scripts/change_password_user.sh {user[0]} {password[0]}"')
        if result[0]!=0:
            self.logger.error(f'Произошла ошибка при смене пароля почтового ящика {user}. Вывод: {result[1].decode("utf-8")}')
            self.msgbox(f'Произошла ошибка при смене почтового ящика:\n{result[1].decode("utf-8")}')
        else:
            self.logger.info(f'Пользователь сменил пароль почтовому ящику {user}. Вывод:: {result[1].decode("utf-8")}')
            self.msgbox(f'Пароль почтового ящика успешно изменен.')

    def change_email(self):
        email_old=('',0)
        email_new=('',0)
        while email_old[0]=='' or email_new[0]=='':
            email_old=self.inputbox('Введите текущий email')
            if not email_old[1]:
                self.logger.debug(f'Пользователь ввел: {email_old[0]}')
                if not self.is_valid_email(email_old[0]):
                    self.msgbox(f'Введенный email не соответствует стандарту именования. Введите корректный адрес.')
                    email_old=('',0)
                    continue
            else:
                return
            email_new = self.inputbox('Введите новое имя почтового ящика')
            if not email_new[1]:
                self.logger.debug(f'Пользователь ввел: {email_new[0]}')
                if not self.is_valid_email(email_new[0]):
                    self.msgbox(f'Введенный email не соответствует стандарту именования. Введите корректный адрес.')
                    email_new=('',0)
                    continue
            else:
                return
        result=self.mailcontainer.exec_run(f'bash -c "/scripts/change_email.sh {email_old[0]} {email_new[0]}"')
        if result[0]!=0:
            self.msgbox(f'Произошла ошибка при смене имени почтового ящика:\n{result[1].decode("utf-8")}')
        else:
            self.msgbox(f'Имя почтового ящика успешно изменено.')

