"""DMS preview — query layer.

All DB reads for PreviewRecord go through this module.
Views and services must not build raw ORM queries themselves.
"""

from __future__ import annotations

import uuid

from django.db.models import QuerySet

from simorgh.apps.dms.common.exceptions import AssetNotFound
from simorgh.apps.dms.preview.models import PreviewRecord, PreviewStatus


def get_preview(document_version, public_id: str) -> PreviewRecord:
    """Return a PreviewRecord that belongs to ``document_version``.

    Raises :exc:`~dms.common.exceptions.AssetNotFound` if not found.
    """
    try:
        uid = uuid.UUID(str(public_id))
    except (ValueError, AttributeError) as exc:
        raise AssetNotFound(f"Invalid preview id: {public_id!r}") from exc
    try:
        return PreviewRecord.objects.select_related("file_asset").get(
            document_version=document_version,
            public_id=uid,
            is_deleted=False,
        )
    except PreviewRecord.DoesNotExist as exc:
        raise AssetNotFound(f"PreviewRecord {public_id!r} not found.") from exc


def list_previews(document_version) -> QuerySet:
    """Return all non-deleted previews for a version, ordered by format/page."""
    return (
        PreviewRecord.objects.filter(
            document_version=document_version, is_deleted=False
        )
        .select_related("file_asset")
        .order_by("preview_format", "page_number")
    )


def get_primary_thumbnail(document_version) -> PreviewRecord | None:
    """Return the primary READY preview for a version, or None."""
    return (
        PreviewRecord.objects.filter(
            document_version=document_version,
            is_primary=True,
            status=PreviewStatus.READY,
            is_deleted=False,
        )
        .select_related("file_asset")
        .first()
    )


def list_previews_by_tenant(tenant_id: int, *, status: str | None = None) -> QuerySet:
    """Tenant-scoped listing, optionally filtered by status.  Useful for admin/ops views."""
    qs = PreviewRecord.objects.filter(tenant_id=tenant_id, is_deleted=False).select_related(
        "file_asset", "document_version"
    )
    if status:
        qs = qs.filter(status=status)
    return qs


def get_preview_by_job_id(provider_job_id: str) -> PreviewRecord | None:
    """Look up a preview by the external converter job reference.

    Returns ``None`` when not found — callers decide how to handle missing
    jobs (the converter may retry or the record may have been deleted).
    """
    return (
        PreviewRecord.objects.filter(
            provider_job_id=provider_job_id, is_deleted=False
        )
        .select_related("file_asset")
        .first()
    )
