"""Reporting Engine — DRF serializers."""

from __future__ import annotations

from rest_framework import serializers

from simorgh.apps.reporting.models import (
    DashboardDefinition,
    KPIDefinition,
    ReportDefinition,
    ReportExecution,
    ScheduledReport,
)


class ReportDefinitionSerializer(serializers.ModelSerializer):
    """Serializer for ReportDefinition CRUD."""

    class Meta:
        model = ReportDefinition
        fields = (
            "id",
            "public_id",
            "code",
            "name",
            "description",
            "module",
            "entity_type",
            "resource",
            "columns",
            "filters_schema",
            "parameters",
            "group_by",
            "sort_by",
            "page_size",
            "export_formats",
            "is_active",
            "is_builtin",
            "created_at",
            "updated_at",
        )
        read_only_fields = (
            "id",
            "public_id",
            "is_builtin",
            "created_at",
            "updated_at",
        )


class ReportExecutionSerializer(serializers.ModelSerializer):
    """Read-only serializer for report execution logs."""

    report_code = serializers.SerializerMethodField()

    class Meta:
        model = ReportExecution
        fields = (
            "id",
            "public_id",
            "report",
            "report_code",
            "schedule",
            "status",
            "format",
            "parameters",
            "filters_applied",
            "file",
            "row_count",
            "error_message",
            "started_at",
            "finished_at",
            "duration_seconds",
            "triggered_by",
            "created_at",
        )
        read_only_fields = fields

    def get_report_code(self, obj: ReportExecution) -> str:
        return obj.report.code if obj.report else ""


class ScheduledReportSerializer(serializers.ModelSerializer):
    """Serializer for ScheduledReport CRUD."""

    report_code = serializers.SerializerMethodField()

    class Meta:
        model = ScheduledReport
        fields = (
            "id",
            "public_id",
            "report",
            "report_code",
            "cron_expression",
            "format",
            "recipients",
            "is_active",
            "last_run_at",
            "next_run_at",
            "run_count",
            "created_at",
            "updated_at",
        )
        read_only_fields = (
            "id",
            "public_id",
            "last_run_at",
            "next_run_at",
            "run_count",
            "created_at",
            "updated_at",
        )

    def get_report_code(self, obj: ScheduledReport) -> str:
        return obj.report.code if obj.report else ""


class KPIDefinitionSerializer(serializers.ModelSerializer):
    """Serializer for KPIDefinition CRUD."""

    class Meta:
        model = KPIDefinition
        fields = (
            "id",
            "public_id",
            "code",
            "name",
            "description",
            "module",
            "resource",
            "trend_resource",
            "format",
            "unit",
            "decimal_places",
            "threshold_warning",
            "threshold_critical",
            "is_active",
            "is_builtin",
            "created_at",
            "updated_at",
        )
        read_only_fields = (
            "id",
            "public_id",
            "is_builtin",
            "created_at",
            "updated_at",
        )


class DashboardDefinitionSerializer(serializers.ModelSerializer):
    """Serializer for DashboardDefinition CRUD."""

    class Meta:
        model = DashboardDefinition
        fields = (
            "id",
            "public_id",
            "code",
            "name",
            "description",
            "module",
            "layout",
            "is_active",
            "is_default",
            "is_builtin",
            "created_at",
            "updated_at",
        )
        read_only_fields = (
            "id",
            "public_id",
            "is_builtin",
            "created_at",
            "updated_at",
        )


# ---------------------------------------------------------------------------
# Request / response schemas for action endpoints
# ---------------------------------------------------------------------------

class ReportRunRequestSerializer(serializers.Serializer):
    """Schema for POST /reports/{id}/run/"""

    format = serializers.ChoiceField(
        choices=["csv", "xlsx", "pdf", "json"],
        default="csv",
    )
    parameters = serializers.DictField(default=dict)
    filters = serializers.DictField(default=dict)


class ReportExportRequestSerializer(serializers.Serializer):
    """Schema for POST /reports/{id}/export/"""

    format = serializers.ChoiceField(
        choices=["csv", "xlsx", "pdf", "json"],
        default="csv",
    )
    filters = serializers.DictField(default=dict)
