"""Email channel ingestion for the Helpdesk module.

Provides an incoming email ingestion endpoint that processes emails sent
to a queue's ``email_address`` and creates tickets.

Endpoint
--------
``POST /helpdesk/email-ingestion/``
    Accepts a JSON payload with ``to``, ``from_email``, ``from_name``,
    ``subject``, and ``body`` fields.  Resolves the target queue by
    matching ``to`` against ``Queue.email_address``.

    Requires authentication or a shared secret header.

Service
-------
``EmailIngestionService.ingest()`` — route an incoming email to the correct
queue, create a ticket, and return the result.
"""

from __future__ import annotations

import structlog

_log = structlog.get_logger("simorgh.helpdesk.email_ingestion")


class EmailIngestionService:
    """Routes incoming emails to queues and creates tickets."""

    @staticmethod
    def ingest(
        *,
        tenant_id: int,
        org_node_id: int,
        to_address: str,
        from_email: str,
        from_name: str = "",
        subject: str = "(no subject)",
        body: str = "",
        actor_id: int | None = None,
    ) -> dict:
        """Process an inbound email and create a helpdesk ticket.

        Returns a dict with ``ticket_id``, ``queue_id``, ``queue_name``.
        """
        from simorgh.apps.helpdesk.models import Queue
        from simorgh.apps.helpdesk.services import TicketService

        queue = Queue.objects.filter(
            tenant_id=tenant_id,
            email_address__iexact=to_address,
            is_active=True,
        ).first()

        if queue is None:
            default_q = (
                Queue.objects.filter(tenant_id=tenant_id, is_default=True, is_active=True).first()
                or Queue.objects.filter(tenant_id=tenant_id, is_active=True).order_by("sort_order", "id").first()
            )
            if default_q is None:
                raise ValueError(f"No active queue found for tenant {tenant_id} and address {to_address}.")
            queue = default_q

        ticket = TicketService.create(
            tenant_id=tenant_id,
            organization_node_id=org_node_id,
            queue_id=queue.pk,
            subject=subject,
            description=body,
            channel="email",
            priority="normal",
            requester_email=from_email,
            requester_name=from_name,
            created_by_id=actor_id,
        )

        _log.info(
            "helpdesk.email_ingestion.ticket_created",
            tenant_id=tenant_id,
            queue_id=queue.pk,
            ticket_id=ticket.pk,
            from_address=from_email,
            to_address=to_address,
        )

        return {
            "ticket_id": ticket.pk,
            "public_id": str(ticket.public_id),
            "reference_number": ticket.reference_number or "",
            "queue_id": queue.pk,
            "queue_name": queue.name,
        }
