from __future__ import annotations

from datetime import datetime
import html
import logging
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate, make_msgid


def send_alert_email(env: dict[str, str], logger: logging.Logger, state_changes: list[dict]) -> None:
    smtp_host = env.get("SMTP_HOST", "")
    if not smtp_host:
        logger.warning("SMTP_HOST non configuré, alerte email ignorée.")
        return

    alert_to_raw = env.get("ALERT_TO", "")
    if not alert_to_raw:
        logger.warning("ALERT_TO non configuré, alerte email ignorée.")
        return

    smtp_port = int(env.get("SMTP_PORT", "587"))
    smtp_user = env.get("SMTP_USER", "")
    smtp_password = env.get("SMTP_PASSWORD", "")
    alert_from = env.get("ALERT_FROM", smtp_user)
    recipients = [recipient.strip() for recipient in alert_to_raw.split(",") if recipient.strip()]

    now_str = datetime.now().strftime("%d/%m/%Y %H:%M")
    count = len(state_changes)
    subject = f"[Analyses] Changement d'etat : {count} site(s) - {now_str}"
    platform_url = "http://analyses.tarbouriech.tech"

    lines = [
        "Bonjour,",
        "",
        f"Des changements de statut ont ete detectes sur {count} site(s) le {now_str}.",
        "",
        "Consultez le detail et l'etat actualise des sites :",
        platform_url,
        "",
    ]
    change_cards: list[str] = []

    for change in state_changes:
        etat_avant = "FERME" if change["etat_avant"] == 1 else "OUVERT"
        etat_apres = "FERME" if change["etat_apres"] == 1 else "OUVERT"
        date_changement = change["date_changement"] or "-"

        lines += [
            "--------------------------------------------------",
            f"Site         : {change['nom_site']}",
            f"Changement   : {etat_avant} -> {etat_apres}",
            f"Date chgt    : {date_changement}",
            "",
        ]

        is_closed = change["etat_apres"] == 1
        card_bg = "#fef2f2" if is_closed else "#ecfdf5"
        card_border = "#fecaca" if is_closed else "#a7f3d0"
        accent = "#991b1b" if is_closed else "#166534"
        badge_bg = "#fee2e2" if is_closed else "#d1fae5"
        status_label = "Ferme" if is_closed else "Ouvert"

        change_cards.append(
            f"""
            <table role=\"presentation\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" style=\"margin:0 0 14px 0;border:1px solid {card_border};border-radius:8px;background:{card_bg};\">
              <tr>
                <td style=\"width:6px;background:{accent};font-size:0;line-height:0;\">&nbsp;</td>
                <td style=\"padding:18px 20px;\">
                  <div style=\"margin:0 0 12px 0;\">
                    <span style=\"display:inline-block;padding:6px 10px;border-radius:999px;background:{badge_bg};color:{accent};font-size:12px;font-weight:bold;text-transform:uppercase;letter-spacing:0.04em;\">{status_label}</span>
                  </div>
                  <div style=\"margin:0 0 8px 0;font-size:14px;color:#111827;\"><strong>Site :</strong> {html.escape(str(change['nom_site']))}</div>
                  <div style=\"margin:0 0 8px 0;font-size:14px;color:#111827;\"><strong>Changement :</strong> {etat_avant} -&gt; {etat_apres}</div>
                  <div style=\"margin:0;font-size:14px;color:#111827;\"><strong>Date du changement :</strong> {html.escape(str(date_changement))}</div>
                </td>
              </tr>
            </table>
            """.strip()
        )

    lines += [
        "--------------------------------------------------",
        "",
        "Cordialement,",
        "Plateforme Analyses Medithau",
        "",
        "Message automatique, merci de ne pas repondre a cet e-mail.",
    ]

    html_body = f"""
    <html>
      <body style=\"margin:0;padding:0;background-color:#f4f6f8;font-family:Arial,Helvetica,sans-serif;color:#1f2937;\">
        <table role=\"presentation\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" style=\"background-color:#f4f6f8;margin:0;padding:24px 0;\">
          <tr>
            <td align=\"center\">
              <table role=\"presentation\" width=\"640\" cellspacing=\"0\" cellpadding=\"0\" style=\"max-width:640px;width:100%;background:#ffffff;border-radius:10px;overflow:hidden;border:1px solid #e5e7eb;\">
                <tr>
                  <td style=\"background:#0f172a;padding:24px 32px;\">
                    <div style=\"font-size:22px;line-height:1.3;font-weight:bold;color:#ffffff;\">Alerte analyses biotoxines</div>
                    <div style=\"margin-top:6px;font-size:14px;color:#cbd5e1;\">Changement de statut detecte sur un ou plusieurs sites</div>
                  </td>
                </tr>
                <tr>
                  <td style=\"padding:32px;\">
                    <p style=\"margin:0 0 16px 0;font-size:15px;line-height:1.6;\">Bonjour,</p>
                    <p style=\"margin:0 0 16px 0;font-size:15px;line-height:1.6;\">Des changements de statut ont ete detectes sur un ou plusieurs sites de suivi des analyses biotoxines.</p>
                    <p style=\"margin:0 0 24px 0;font-size:15px;line-height:1.6;\">Vous pouvez consulter le detail et l'etat actualise des sites a l'adresse suivante :</p>
                    <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" style=\"margin:0 0 28px 0;\">
                      <tr>
                        <td style=\"border-radius:6px;background:#0f766e;\">
                          <a href=\"{platform_url}\" style=\"display:inline-block;padding:12px 18px;font-size:14px;font-weight:bold;color:#ffffff;text-decoration:none;\">Voir la plateforme des analyses</a>
                        </td>
                      </tr>
                    </table>
                    <div style=\"margin:0 0 16px 0;font-size:16px;font-weight:bold;color:#111827;\">Changements detectes</div>
                    {''.join(change_cards)}
                    <p style=\"margin:24px 0 0 0;font-size:15px;line-height:1.6;\">Cordialement,</p>
                    <p style=\"margin:4px 0 0 0;font-size:15px;line-height:1.6;font-weight:bold;\">Plateforme Analyses Medithau</p>
                  </td>
                </tr>
                <tr>
                  <td style=\"padding:18px 32px;background:#f9fafb;border-top:1px solid #e5e7eb;font-size:12px;line-height:1.5;color:#6b7280;\">Message automatique, merci de ne pas repondre a cet e-mail.</td>
                </tr>
              </table>
            </td>
          </tr>
        </table>
      </body>
    </html>
    """.strip()

    message = MIMEMultipart("alternative")
    message["Subject"] = subject
    message["From"] = alert_from
    message["To"] = ", ".join(recipients)
    message["Date"] = formatdate(localtime=True)
    message["Message-ID"] = make_msgid(domain=alert_from.split("@")[-1] if "@" in alert_from else "localhost")
    message.attach(MIMEText("\n".join(lines), "plain", "utf-8"))
    message.attach(MIMEText(html_body, "html", "utf-8"))

    try:
        if smtp_port == 465:
            with smtplib.SMTP_SSL(smtp_host, smtp_port) as smtp:
                if smtp_user:
                    smtp.login(smtp_user, smtp_password)
                smtp.sendmail(alert_from, recipients, message.as_string())
        else:
            with smtplib.SMTP(smtp_host, smtp_port) as smtp:
                smtp.ehlo()
                smtp.starttls()
                smtp.ehlo()
                if smtp_user:
                    smtp.login(smtp_user, smtp_password)
                smtp.sendmail(alert_from, recipients, message.as_string())
        logger.info(
            "Alerte email envoyee a %s (%d changement(s))",
            ", ".join(recipients),
            count,
        )
    except Exception as exc:
        logger.error("Erreur lors de l'envoi de l'alerte email : %s", exc)
