"""
Analytics Service — Serializers.
"""
from rest_framework import serializers
from .models import (
    AggregationDefinition, AggregationSnapshot,
    KPIRollup,
    ReportTemplate, GeneratedReport,
)


# ─── Aggregation Definition ──────────────────────

class AggregationDefinitionListSerializer(serializers.ModelSerializer):
    class Meta:
        model = AggregationDefinition
        fields = [
            "id", "name", "source_module", "source_entity",
            "aggregation_type", "is_active", "created_at",
        ]


class AggregationDefinitionDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = AggregationDefinition
        fields = [
            "id", "name", "description", "source_module", "source_entity",
            "aggregation_type", "aggregation_field",
            "filter_criteria", "group_by", "schedule",
            "is_active", "metadata", "created_at", "updated_at",
        ]


class AggregationDefinitionCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = AggregationDefinition
        fields = [
            "name", "description", "source_module", "source_entity",
            "aggregation_type", "aggregation_field",
            "filter_criteria", "group_by", "schedule",
        ]


# ─── Aggregation Snapshot ────────────────────────

class AggregationSnapshotListSerializer(serializers.ModelSerializer):
    definition_name = serializers.CharField(source="definition.name", read_only=True)

    class Meta:
        model = AggregationSnapshot
        fields = [
            "id", "definition", "definition_name",
            "snapshot_date", "record_count", "execution_time_ms",
            "created_at",
        ]


class AggregationSnapshotDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = AggregationSnapshot
        fields = [
            "id", "definition", "snapshot_date",
            "data", "record_count", "execution_time_ms",
            "metadata", "created_at", "updated_at",
        ]


# ─── KPI Rollup ─────────────────────────────────

class KPIRollupListSerializer(serializers.ModelSerializer):
    class Meta:
        model = KPIRollup
        fields = [
            "id", "kpi_code", "kpi_name", "level",
            "entity_id", "period", "value", "target_value",
            "trend", "change_percentage",
        ]


class KPIRollupDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = KPIRollup
        fields = [
            "id", "kpi_code", "kpi_name", "level",
            "entity_id", "period", "value", "previous_value",
            "target_value", "trend", "change_percentage",
            "metadata", "created_at", "updated_at",
        ]


# ─── Report Template ────────────────────────────

class ReportTemplateListSerializer(serializers.ModelSerializer):
    class Meta:
        model = ReportTemplate
        fields = [
            "id", "name", "modules", "default_format",
            "is_scheduled", "is_active", "created_at",
        ]


class ReportTemplateDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = ReportTemplate
        fields = [
            "id", "name", "description", "modules",
            "query_definition", "format_options",
            "default_format", "is_scheduled", "schedule",
            "owner", "is_active", "metadata",
            "created_at", "updated_at",
        ]


class ReportTemplateCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = ReportTemplate
        fields = [
            "name", "description", "modules",
            "query_definition", "format_options",
            "default_format", "is_scheduled", "schedule",
        ]


# ─── Generated Report ───────────────────────────

class GeneratedReportListSerializer(serializers.ModelSerializer):
    template_name = serializers.CharField(source="template.name", read_only=True)

    class Meta:
        model = GeneratedReport
        fields = [
            "id", "template", "template_name", "title",
            "format", "status", "generated_at", "file_size",
        ]


class GeneratedReportDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = GeneratedReport
        fields = [
            "id", "template", "title", "parameters",
            "format", "status", "file_url", "file_size",
            "generated_by", "generated_at", "error_message",
            "metadata", "created_at", "updated_at",
        ]


class GeneratedReportCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = GeneratedReport
        fields = ["template", "title", "parameters", "format"]


# ─── Dashboard Serializers ───────────────────────

class ExecutiveSummarySerializer(serializers.Serializer):
    total_portfolios = serializers.IntegerField()
    total_programs = serializers.IntegerField()
    total_projects = serializers.IntegerField()
    active_kpis = serializers.IntegerField()
    objectives_on_track = serializers.IntegerField()
    objectives_at_risk = serializers.IntegerField()
    budget_utilization = serializers.DecimalField(max_digits=5, decimal_places=2)
    resource_utilization = serializers.DecimalField(max_digits=5, decimal_places=2)


class PortfolioHealthSerializer(serializers.Serializer):
    portfolio_id = serializers.UUIDField()
    portfolio_name = serializers.CharField()
    status = serializers.CharField()
    health = serializers.CharField()  # green/amber/red
    project_count = serializers.IntegerField()
    budget_variance = serializers.DecimalField(max_digits=10, decimal_places=2)
    schedule_variance = serializers.DecimalField(max_digits=10, decimal_places=2)


class RiskHeatmapItemSerializer(serializers.Serializer):
    category = serializers.CharField()
    probability = serializers.DecimalField(max_digits=5, decimal_places=2)
    impact = serializers.DecimalField(max_digits=5, decimal_places=2)
    count = serializers.IntegerField()


class StrategyAlignmentSerializer(serializers.Serializer):
    objective_id = serializers.UUIDField()
    objective_title = serializers.CharField()
    alignment_score = serializers.DecimalField(max_digits=5, decimal_places=2)
    linked_projects = serializers.IntegerField()
    kpi_on_target = serializers.IntegerField()
    kpi_off_target = serializers.IntegerField()
