"""Email provider implementations: Resend, Mailgun, Null."""

from __future__ import annotations

import logging
from typing import List, Optional, Union

logger = logging.getLogger(__name__)


class NullEmailSender:
    """No-op sender when email is disabled."""

    def send(
        self,
        to: Union[str, List[str]],
        subject: str,
        html: Optional[str] = None,
        text: Optional[str] = None,
    ) -> bool:
        logger.debug("NullEmailSender: would send to %s subject=%s", to, subject)
        return True


class ResendEmailSender:
    """Send via Resend API."""

    def __init__(self, api_key: str, from_email: str) -> None:
        self._api_key = api_key
        self._from_email = from_email

    def send(
        self,
        to: Union[str, List[str]],
        subject: str,
        html: Optional[str] = None,
        text: Optional[str] = None,
    ) -> bool:
        try:
            import requests
        except ImportError:
            logger.error("requests not installed for Resend")
            return False
        recipients = [to] if isinstance(to, str) else to
        payload = {
            "from": self._from_email,
            "to": recipients,
            "subject": subject,
        }
        if html:
            payload["html"] = html
        if text:
            payload["text"] = text
        try:
            resp = requests.post(
                "https://api.resend.com/emails",
                headers={"Authorization": f"Bearer {self._api_key}"},
                json=payload,
                timeout=30,
            )
            if resp.status_code in (200, 201, 202):
                return True
            logger.error("Resend send failed: %s %s", resp.status_code, resp.text[:200])
            return False
        except Exception as e:
            logger.exception("Resend send error: %s", e)
            return False


class MailgunEmailSender:
    """Send via Mailgun API."""

    def __init__(self, api_key: str, domain: str, from_email: str) -> None:
        self._api_key = api_key
        self._domain = domain
        self._from_email = from_email

    def send(
        self,
        to: Union[str, List[str]],
        subject: str,
        html: Optional[str] = None,
        text: Optional[str] = None,
    ) -> bool:
        try:
            import requests
        except ImportError:
            logger.error("requests not installed for Mailgun")
            return False
        recipients = [to] if isinstance(to, str) else to
        data = {
            "from": self._from_email,
            "to": recipients,
            "subject": subject,
        }
        if html:
            data["html"] = html
        if text:
            data["text"] = text
        try:
            resp = requests.post(
                f"https://api.mailgun.net/v3/{self._domain}/messages",
                auth=("api", self._api_key),
                data=data,
                timeout=30,
            )
            if resp.status_code in (200, 201, 202):
                return True
            logger.error("Mailgun send failed: %s %s", resp.status_code, resp.text[:200])
            return False
        except Exception as e:
            logger.exception("Mailgun send error: %s", e)
            return False


def get_email_sender():
    """Factory: select implementation from settings."""
    from settings import load_email_config
    cfg = load_email_config()
    if cfg.provider == "resend" and cfg.resend_api_key and cfg.from_address:
        return ResendEmailSender(cfg.resend_api_key, cfg.from_address)
    if cfg.provider == "mailgun" and cfg.mailgun_api_key and cfg.mailgun_domain and cfg.from_address:
        return MailgunEmailSender(cfg.mailgun_api_key, cfg.mailgun_domain, cfg.from_address)
    return NullEmailSender()
