"""Content Engine — global search registration.

Registers content.item as a searchable entity so the platform global search
can surface content results alongside other entities.
"""

from __future__ import annotations

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


def _search_content(ctx, query: str) -> list[SearchHit]:  # type: ignore[type-arg]
    from django.db.models import Q

    from simorgh.apps.content.models import ContentItem, ContentStatus, ContentVisibility

    if not ctx.tenant_id:
        return []

    qs = ContentItem.objects.filter(
        tenant_id=ctx.tenant_id,
        status=ContentStatus.PUBLISHED,
    ).select_related("category", "author")

    # Visibility filter
    if ctx.user_id and hasattr(ctx, "permissions") and ctx.permissions:
        qs = qs.filter(
            Q(visibility=ContentVisibility.PUBLIC)
            | Q(visibility=ContentVisibility.INTERNAL)
            | Q(visibility=ContentVisibility.PRIVATE, author_id=ctx.user_id)
        )
    else:
        qs = qs.filter(visibility=ContentVisibility.PUBLIC)

    # Text filter
    qs = qs.filter(
        Q(title__icontains=query)
        | Q(body__icontains=query)
        | Q(excerpt__icontains=query)
        | Q(category__name__icontains=query)
        | Q(meta_keywords__icontains=query)
    )[:20]

    results: list[SearchHit] = []
    for item in qs:
        ctype = item.get_content_type_display() if hasattr(item, "get_content_type_display") else item.content_type
        cat = item.category.name if item.category_id else ""
        results.append(
            SearchHit(
                entity_type="content.item",
                entity_id=str(item.public_id),
                title=item.title,
                subtitle=f"{ctype} · {cat}".strip(" ·"),
                url=f"/content/items/{item.public_id}",
                score=1.0,
            )
        )
    return results


register_searchable(
    SearchableSpec(
        entity="content.item",
        label_key="content.item",
        search=_search_content,
    )
)
