import os
import smtplib
import logging
from email.mime.text import MIMEText

from restic_compose_backup.alerts.base import BaseAlert

logger = logging.getLogger(__name__)


class SMTPAlert(BaseAlert):
    name = 'smtp'

    def __init__(self, host, port, user, password, to):
        self.host = host
        self.port = port
        self.user = user
        self.password = password
        self.to = to

    @classmethod
    def create_from_env(cls):
        instance = cls(
            os.environ.get('EMAIL_HOST'),
            os.environ.get('EMAIL_PORT'),
            os.environ.get('EMAIL_HOST_USER'),
            os.environ.get('EMAIL_HOST_PASSWORD'),
            (os.environ.get('EMAIL_SEND_TO') or "").split(','),
        )
        if instance.properly_configured:
            return instance

        return None

    @property
    def properly_configured(self) -> bool:
        return self.host and self.port and self.user and self.password and len(self.to) > 0

    def send(self, subject: str = None, body: str = None, alert_type: str = 'INFO'):
        # send_mail("Hello world!")
        msg = MIMEText(body)
        msg['Subject'] = f"[{alert_type}] {subject}"
        msg['From'] = self.user
        msg['To'] = ', '.join(self.to)

        try:
            logger.info("Connecting to %s port %s", self.host, self.port)
            server = smtplib.SMTP_SSL(self.host, self.port)
            server.ehlo()
            server.login(self.user, self.password)
            server.sendmail(self.user, self.to, msg.as_string())
            logger.info('Email sent')
        except Exception as ex:
            logger.error(ex)
        finally:
            server.close()