"""Ops/admin notification adapter.

Domain services depend on OpsNotifierProtocol. This adapter fans a message out
to the configured ops inboxes through EmailProviderProtocol.
"""
from __future__ import annotations

from typing import Optional, Sequence

import structlog

from src.config import get_settings
from src.core.protocols import EmailProviderProtocol, OpsNotifierProtocol
from src.integrations.email_provider import email_transport_configured, get_email_provider

logger = structlog.get_logger()


class EmailOpsNotifier:
    """Deliver an ops notification to every configured recipient."""

    def __init__(
        self,
        email_provider: Optional[EmailProviderProtocol],
        recipients: Sequence[str],
    ):
        self._email_provider = email_provider
        self._recipients = [r.strip().lower() for r in recipients if r and r.strip()]

    async def notify(
        self,
        *,
        subject: str,
        html: str,
        text: str,
        reply_to: Optional[str] = None,
    ) -> None:
        if not self._email_provider:
            logger.warning("ops_notify_skipped_email_unconfigured", subject=subject)
            return
        if not self._recipients:
            logger.warning("ops_notify_skipped_no_recipients", subject=subject)
            return

        sent = 0
        failed = 0
        for to in self._recipients:
            result = await self._email_provider.send(
                to,
                subject,
                html,
                text,
                reply_to=reply_to,
            )
            if result.success:
                sent += 1
            else:
                failed += 1
                logger.error(
                    "ops_notify_recipient_failed",
                    to=to,
                    subject=subject,
                    error=result.error,
                )
        logger.info(
            "ops_notify_complete",
            subject=subject,
            sent=sent,
            failed=failed,
            recipient_count=len(self._recipients),
        )


def get_ops_notifier() -> OpsNotifierProtocol:
    settings = get_settings()
    provider = None
    if email_transport_configured(settings):
        provider = get_email_provider()
    return EmailOpsNotifier(provider, settings.ops_notify_email_list)
