"""Correspondence global search integration.

Registers the ``correspondence.letter`` entity with the platform's global search
so the workspace-level search bar can find letters in the archive.
"""

from __future__ import annotations

from typing import TYPE_CHECKING

from simorgh.core.search import SearchableSpec, SearchHit, register_searchable

if TYPE_CHECKING:
    from simorgh.core.context import RequestContext


def _search_letters(ctx: RequestContext, query: str, limit: int) -> list[SearchHit]:
    """Full-text search across correspondence letters."""
    from django.db.models import Q

    from simorgh.apps.correspondence.models import Letter

    if not ctx.tenant:
        return []

    qs = Letter.objects.filter(tenant_id=ctx.tenant.pk)

    qs = qs.filter(
        Q(subject__icontains=query)
        | Q(body__icontains=query)
        | Q(registration_number__icontains=query)
        | Q(sender_external__icontains=query)
        | Q(sender_organization__icontains=query)
        | Q(external_reference__icontains=query)
        | Q(summary__icontains=query)
    ).order_by("-created_at")[:limit]

    hits = []
    for letter in qs:
        score = 1.0
        if query.lower() in letter.subject.lower():
            score = 3.0
        elif query.lower() in letter.registration_number.lower():
            score = 2.5

        hits.append(
            SearchHit(
                entity="correspondence.letter",
                id=str(letter.public_id),
                title=letter.subject,
                subtitle=f"{letter.registration_number or '#' + str(letter.pk)} · {letter.get_letter_type_display()} · {letter.get_status_display()}",
                url=f"/correspondence/letters/{letter.public_id}/",
                icon="mail",
                score=score,
                extra={
                    "letter_type": letter.letter_type,
                    "status": letter.status,
                    "priority": letter.priority,
                    "registration_number": letter.registration_number,
                },
            )
        )

    return hits


LETTER_SEARCHABLE = register_searchable(
    SearchableSpec(
        entity="correspondence.letter",
        label_key="correspondence.search.letter",
        search=_search_letters,
        permission="correspondence.letter.view",
        description="Search correspondence letters by subject, body, registration number, sender",
    )
)
