import os
import smtplib
from email.message import EmailMessage
from pathlib import Path
from typing import Optional

EMAIL_LOG_DIR = Path(os.getenv("EMAIL_LOG_DIR", "./email-outbox"))


def send_password_reset_email(to_email: str, reset_url: str, user_name: Optional[str] = None) -> None:
    subject = "Réinitialisation de votre accès RenoValid"
    greeting = "Bonjour{}".format(" " + user_name if user_name else "")
    body = """{greeting},

Une demande de réinitialisation de mot de passe a été faite pour votre compte RenoValid.

Pour créer un nouveau mot de passe, ouvrez ce lien :
{reset_url}

Ce lien est temporaire. Si vous n'êtes pas à l'origine de cette demande, vous pouvez ignorer cet email.

RenoValid
""".format(greeting=greeting, reset_url=reset_url)

    smtp_host = os.getenv("SMTP_HOST")
    smtp_port = int(os.getenv("SMTP_PORT", "587"))
    smtp_user = os.getenv("SMTP_USER")
    smtp_password = os.getenv("SMTP_PASSWORD")
    smtp_from = os.getenv("SMTP_FROM", smtp_user or "no-reply@renovalid.local")

    if not smtp_host:
        EMAIL_LOG_DIR.mkdir(parents=True, exist_ok=True)
        safe_name = to_email.replace("@", "_at_").replace("/", "_")
        (EMAIL_LOG_DIR / "password-reset-{}.txt".format(safe_name)).write_text(
            "To: {}\nSubject: {}\n\n{}".format(to_email, subject, body),
            encoding="utf-8",
        )
        return

    message = EmailMessage()
    message["From"] = smtp_from
    message["To"] = to_email
    message["Subject"] = subject
    message.set_content(body)

    with smtplib.SMTP(smtp_host, smtp_port) as smtp:
        smtp.starttls()
        if smtp_user and smtp_password:
            smtp.login(smtp_user, smtp_password)
        smtp.send_message(message)
