from rest_framework import serializers

from apps.mel.indicators.models import (
    DataPoint,
    Indicator,
    IndicatorTarget,
    LogFrame,
    LogFrameRow,
)


class LogFrameRowSerializer(serializers.ModelSerializer):
    level_display = serializers.CharField(source="get_level_display", read_only=True)

    class Meta:
        model = LogFrameRow
        fields = [
            "id",
            "logframe",
            "parent",
            "level",
            "level_display",
            "title",
            "description",
            "assumptions",
            "order",
        ]


class LogFrameSerializer(serializers.ModelSerializer):
    rows = LogFrameRowSerializer(many=True, read_only=True)

    class Meta:
        model = LogFrame
        fields = ["id", "name", "slug", "description", "programme", "active", "rows"]


class IndicatorTargetSerializer(serializers.ModelSerializer):
    class Meta:
        model = IndicatorTarget
        fields = [
            "id",
            "indicator",
            "period_label",
            "period_start",
            "period_end",
            "baseline_value",
            "target_value",
            "notes",
        ]


class IndicatorSerializer(serializers.ModelSerializer):
    targets = IndicatorTargetSerializer(many=True, read_only=True)
    frequency_display = serializers.CharField(source="get_frequency_display", read_only=True)

    class Meta:
        model = Indicator
        fields = [
            "id",
            "logframe_row",
            "code",
            "name",
            "definition",
            "indicator_type",
            "unit",
            "calculation_method",
            "data_source",
            "frequency",
            "frequency_display",
            "source_module",
            "auto_event_type",
            "is_active",
            "targets",
        ]


class DataPointSerializer(serializers.ModelSerializer):
    status_display = serializers.CharField(source="get_status_display", read_only=True)

    class Meta:
        model = DataPoint
        fields = [
            "id",
            "indicator",
            "target",
            "period_label",
            "reported_at",
            "value",
            "qualitative_note",
            "source_module",
            "source_event",
            "source_object_id",
            "status",
            "status_display",
            "created_at",
        ]
        read_only_fields = ["source_module", "source_event", "source_object_id", "created_at"]
