"""KB search registration.

Registers the kb.article searchable so the global platform search
can surface KB article results for authenticated users.
"""

from __future__ import annotations

from simorgh.core.search import SearchHit, SearchableSpec, register_searchable


def _search_kb_articles(ctx, query: str) -> list[SearchHit]:  # type: ignore[type-arg]
    from simorgh.apps.kb.models import ArticleStatus, ArticleVisibility, KBArticle
    from django.db.models import Q

    if not ctx.tenant_id:
        return []

    qs = KBArticle.objects.filter(
        tenant_id=ctx.tenant_id,
        status=ArticleStatus.PUBLISHED,
    ).select_related("category", "author")

    # Visibility filter
    if ctx.user_id:
        qs = qs.filter(
            Q(visibility=ArticleVisibility.PUBLIC)
            | Q(visibility=ArticleVisibility.INTERNAL)
            | Q(visibility=ArticleVisibility.PRIVATE, author_id=ctx.user_id)
        )
    else:
        qs = qs.filter(visibility=ArticleVisibility.PUBLIC)

    # Text filter
    qs = qs.filter(
        Q(title__icontains=query)
        | Q(body_html__icontains=query)
        | Q(category__name__icontains=query)
    )[:20]

    results: list[SearchHit] = []
    for article in qs:
        category_label = article.category.name if article.category_id else ""
        results.append(
            SearchHit(
                entity_type="kb.article",
                entity_id=str(article.public_id),
                title=article.title,
                subtitle=category_label,
                url=f"/kb/articles/{article.public_id}",
                score=1.0,
            )
        )
    return results


register_searchable(
    SearchableSpec(
        entity="kb.article",
        label_key="kb.article",
        search=_search_kb_articles,
    )
)
