"""DMS AI bounded context — query utilities."""

from __future__ import annotations

import uuid
from typing import Optional

from simorgh.apps.dms.ai.models import AIClassification, AIClassificationType, ExtractedEntity, OCRResult, OCRStatus


# ---------------------------------------------------------------------------
# OCRResult queries
# ---------------------------------------------------------------------------

def get_ocr_result(tenant_id: int, ocr_id: str) -> OCRResult:
    """Return an active OCRResult by public_id or raise 404-style exception."""
    from simorgh.apps.dms.common.exceptions import AssetNotFound

    try:
        return OCRResult.objects.get(
            tenant_id=tenant_id,
            public_id=uuid.UUID(str(ocr_id)),
            is_deleted=False,
        )
    except (OCRResult.DoesNotExist, ValueError) as exc:
        raise AssetNotFound(f"OCRResult {ocr_id!r} not found.") from exc


def list_ocr_results(tenant_id: int, document_version_id: str) -> "QuerySet[OCRResult]":
    """Return all active OCR results for a document version, newest first."""
    return OCRResult.objects.filter(
        tenant_id=tenant_id,
        document_version__public_id=document_version_id,
        is_deleted=False,
    ).order_by("-submitted_at")


def get_latest_ocr_result(
    tenant_id: int,
    document_version_id: str,
    provider: Optional[str] = None,
) -> Optional[OCRResult]:
    """Return the most recent completed OCR result for a version."""
    qs = OCRResult.objects.filter(
        tenant_id=tenant_id,
        document_version__public_id=document_version_id,
        status=OCRStatus.COMPLETED,
        is_deleted=False,
    )
    if provider:
        qs = qs.filter(provider=provider)
    return qs.order_by("-submitted_at").first()


# ---------------------------------------------------------------------------
# AIClassification queries
# ---------------------------------------------------------------------------

def get_ai_classification(tenant_id: int, classification_id: str) -> AIClassification:
    """Return an active AIClassification by public_id."""
    from simorgh.apps.dms.common.exceptions import AssetNotFound

    try:
        return AIClassification.objects.get(
            tenant_id=tenant_id,
            public_id=uuid.UUID(str(classification_id)),
            is_deleted=False,
        )
    except (AIClassification.DoesNotExist, ValueError) as exc:
        raise AssetNotFound(f"AIClassification {classification_id!r} not found.") from exc


def list_ai_classifications(
    tenant_id: int,
    document_version_id: str,
    classification_type: Optional[str] = None,
) -> "QuerySet[AIClassification]":
    """Return AI classifications for a document version, optionally filtered by type."""
    qs = AIClassification.objects.filter(
        tenant_id=tenant_id,
        document_version__public_id=document_version_id,
        is_deleted=False,
    )
    if classification_type:
        qs = qs.filter(classification_type=classification_type)
    return qs.order_by("-created_at")


# ---------------------------------------------------------------------------
# ExtractedEntity queries
# ---------------------------------------------------------------------------

def list_extracted_entities(
    tenant_id: int,
    document_version_id: str,
    entity_type: Optional[str] = None,
) -> "QuerySet[ExtractedEntity]":
    """Return extracted entities for a document version."""
    qs = ExtractedEntity.objects.filter(
        tenant_id=tenant_id,
        document_version__public_id=document_version_id,
        is_deleted=False,
    )
    if entity_type:
        qs = qs.filter(entity_type=entity_type)
    return qs.order_by("entity_type", "value")
