"""Views & Visualization — read-only selectors.

All queries are scoped via the tenant context from the request.
"""

from __future__ import annotations

from django.db.models import QuerySet

from simorgh.apps.visualization.models import (
    ChartConfiguration,
    DashboardConfiguration,
    DashboardWidget,
    ViewConfiguration,
    ViewFilter,
    ViewGrouping,
)


def get_view_configurations(
    *,
    tenant_id: int,
    entity_name: str | None = None,
    view_type: str | None = None,
    visibility: str | None = None,
) -> QuerySet[ViewConfiguration]:
    qs = ViewConfiguration.objects.filter(tenant_id=tenant_id)
    if entity_name:
        qs = qs.filter(entity_name=entity_name)
    if view_type:
        qs = qs.filter(view_type=view_type)
    if visibility:
        qs = qs.filter(visibility=visibility)
    return qs.select_related("created_by", "updated_by")


def get_view_configuration(*, tenant_id: int, view_id: int) -> ViewConfiguration:
    return ViewConfiguration.objects.get(tenant_id=tenant_id, pk=view_id)


def get_default_view(*, tenant_id: int, entity_name: str) -> ViewConfiguration | None:
    return ViewConfiguration.objects.filter(
        tenant_id=tenant_id,
        entity_name=entity_name,
        is_default=True,
    ).first()


def get_view_filters(*, tenant_id: int, view_id: int) -> QuerySet[ViewFilter]:
    return ViewFilter.objects.filter(tenant_id=tenant_id, view_id=view_id)


def get_view_groupings(*, tenant_id: int, view_id: int) -> QuerySet[ViewGrouping]:
    return ViewGrouping.objects.filter(tenant_id=tenant_id, view_id=view_id)


def get_dashboards(
    *,
    tenant_id: int,
    visibility: str | None = None,
) -> QuerySet[DashboardConfiguration]:
    qs = DashboardConfiguration.objects.filter(tenant_id=tenant_id)
    if visibility:
        qs = qs.filter(visibility=visibility)
    return qs.prefetch_related("widgets").select_related("created_by", "updated_by")


def get_dashboard(*, tenant_id: int, dashboard_id: int) -> DashboardConfiguration:
    return (
        DashboardConfiguration.objects
        .filter(tenant_id=tenant_id, pk=dashboard_id)
        .prefetch_related("widgets")
        .get()
    )


def get_dashboard_widgets(*, tenant_id: int, dashboard_id: int) -> QuerySet[DashboardWidget]:
    return DashboardWidget.objects.filter(tenant_id=tenant_id, dashboard_id=dashboard_id)


def get_chart_configurations(
    *,
    tenant_id: int,
    entity_name: str | None = None,
) -> QuerySet[ChartConfiguration]:
    qs = ChartConfiguration.objects.filter(tenant_id=tenant_id)
    if entity_name:
        qs = qs.filter(entity_name=entity_name)
    return qs.select_related("created_by", "updated_by")


def get_chart_configuration(*, tenant_id: int, chart_id: int) -> ChartConfiguration:
    return ChartConfiguration.objects.get(tenant_id=tenant_id, pk=chart_id)
