import os
import sys

from PyQt6 import QtWidgets

from src import Icon, settings as config, logger


from .dialog_sources.Ui_mail_preview import Ui_eMailPreview as MailPreviewDialog
from .mailTemplate import MailTemplateDialog


empty_signature = """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">

    <html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style
    type="text/css">

    p, li { white-space: pre-wrap; }

    hr { height: 1px; border-width: 0; }

    li.unchecked::marker { content: "\2610"; }

    li.checked::marker { content: "\2612"; }

    </style></head><body style=" font-family:''Segoe UI''; font-size:9pt; font-weight:400;
    font-style:normal;">

    <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px;
    margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html>
"""


class Mail_Dialog(QtWidgets.QDialog, MailPreviewDialog):
    def __init__(
        self,
        app_id,
        app_name,
        app_subject,
        prof_name,
        prof_mail,
        parent=None,
        default_mail="Information zum Semesterapparat",
    ):
        super().__init__(parent)
        self.setupUi(self)

        logger.info("Setting up mail dialog")
        self.appid = app_id
        self.appname = app_name
        self.subject = app_subject
        self.profname = prof_name
        self.mail_data = ""
        self.signature = self.determine_signature()
        self.prof_mail = prof_mail
        self.comboBox.currentIndexChanged.connect(self.set_mail)
        self.prof_name.setText(prof_name)
        self.mail_name.setText(self.prof_mail)
        self.load_mail_templates()
        # if none of the radio buttons is checked, disable the accept button of the dialog
        self.setWindowIcon(Icon("mail").icon)
        self.btn_okay.setEnabled(False)
        Icon("edit_note", self.newTemplate)
        self.newTemplate.clicked.connect(self.open_new_template)

        if default_mail is not None:
            # get the nearest match to the default mail
            for i in range(self.comboBox.count()):
                if default_mail in self.comboBox.itemText(i):
                    default_mail = self.comboBox.itemText(i)
                    break
        self.comboBox.setCurrentText(default_mail)

        self.gender_female.clicked.connect(self.set_mail)
        self.gender_male.clicked.connect(self.set_mail)
        self.gender_non.clicked.connect(self.set_mail)
        self.btn_okay.clicked.connect(self.createAndSendMail)

    def open_new_template(self):
        logger.info("Opening new template dialog")
        # TODO: implement new mail template dialog
        dialog = MailTemplateDialog()
        dialog.updateSignal.connect(self.load_mail_templates)
        dialog.exec()

        pass

    def determine_signature(self):
        if config.mail.signature is empty_signature or config.mail.signature == "":
            return """Mit freundlichen Grüßen
Ihr Semesterapparatsteam
Mail: semesterapparate@ph-freiburg.de
Tel.: 0761/682-778 | 07617682-545"""
        else:
            return config.mail.signature

    def load_mail_templates(self):
        # print("loading mail templates")
        logger.info("Loading mail templates")
        mail_templates = os.listdir("mail_vorlagen")
        logger.info(f"Mail templates: {mail_templates}")
        self.comboBox.clear()
        for template in mail_templates:
            self.comboBox.addItem(template)

    def get_greeting(self):
        prof = self.profname.split(" ")[0]
        if self.gender_male.isChecked():
            self.btn_okay.setEnabled(True)
            return f"Sehr geehrter Herr {prof},"
        elif self.gender_female.isChecked():
            self.btn_okay.setEnabled(True)
            return f"Sehr geehrte Frau {prof},"
        elif self.gender_non.isChecked():
            self.btn_okay.setEnabled(True)
            name = f"{self.profname.split(' ')[1]} {self.profname.split(' ')[0]}"
            return f"Guten Tag {name},"

    def set_mail(self):
        logger.info("Setting mail")
        email_template = self.comboBox.currentText()
        if email_template == "":
            logger.debug("No mail template selected")
            return
        with open(f"mail_vorlagen/{email_template}", "r", encoding="utf-8") as f:
            mail_template = f.read()
        email_header = email_template.split(".eml")[0]
        if "{AppNr}" in email_template:
            email_header = email_template.split(".eml")[0]
        email_header = email_header.format(AppNr=self.appid, AppName=self.appname)
        self.mail_header.setText(email_header)
        self.mail_data = mail_template.split("<html>")[0]
        mail_html = mail_template.split("<html>")[1]
        mail_html = "<html>" + mail_html
        Appname = self.appname
        mail_html = mail_html.format(
            Profname=self.profname.split(" ")[0],
            Appname=Appname,
            AppNr=self.appid,
            AppSubject=self.subject,
            greeting=self.get_greeting(),
            signature=self.signature,
        )

        self.mail_body.setHtml(mail_html)

    def createAndSendMail(self):
        logger.info("Sending mail")
        import smtplib
        from email.mime.multipart import MIMEMultipart
        from email.mime.text import MIMEText

        tolist = [self.prof_mail, "semesterapparate@ph-freiburg.de"]
        self.btn_okay.setText("Mail wird gesendet")
        smtp_server = config.mail.smtp_server
        port: int = config.mail.port
        sender_email = config.mail.sender
        password = config.mail.password
        message = MIMEMultipart()
        message["From"] = sender_email
        message["To"] = self.prof_mail
        message["Subject"] = self.mail_header.text()
        # include a Fcc to the senders sent folder
        message["cc"] = "semesterapparate@ph-freiburg.de"

        mail_body = self.mail_body.toHtml()
        message.attach(MIMEText(mail_body, "html"))
        mail = message.as_string()

        with smtplib.SMTP_SSL(smtp_server, port) as server:
            server.connect(smtp_server, port)
            # server.connect(smtp_server, port)
            # server.auth(mechanism="PLAIN")
            if config.mail.use_user_name is True:
                # print(config["mail"]["user_name"])

                server.login(config.mail.user_name, password)
            else:
                server.login(sender_email, password)
            server.sendmail(sender_email, tolist, mail)

            # print("Mail sent")
            # end active process
            server.quit()
        logger.info("Mail sent, closing connection to server and dialog")
        # close the dialog

        self.accept()


def launch_gui(
    app_id="1",
    app_name="Test",
    app_subject="Test",
    prof_name="Tester, 001",
    prof_mail="alexander.kirchner@ph-freiburg.de",
):
    app = QtWidgets.QApplication(sys.argv)
    dialog = Mail_Dialog(
        app_id=app_id,
        app_name=app_name,
        app_subject=app_subject,
        prof_name=prof_name,
        prof_mail=prof_mail,
        default_mail="Information bezüglich der Auflösung des Semesterapparates",
    )
    dialog.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Mail_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec())
