from rest_framework import serializers

from apps.mel.tracking.models import (
    Activity,
    ActivityDependency,
    CorrectiveAction,
    OutputDeliverable,
    UpstreamEvent,
)


class UpstreamEventSerializer(serializers.ModelSerializer):
    module_display = serializers.CharField(source="get_module_display", read_only=True)

    class Meta:
        model = UpstreamEvent
        fields = [
            "id", "module", "module_display", "event_type",
            "source_object_id", "subject", "payload", "recorded_at",
        ]


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

    class Meta:
        model = Activity
        fields = [
            "id", "logframe_row", "name", "description",
            "scheduled_start", "scheduled_end", "actual_start", "actual_end",
            "status", "status_display", "responsible", "parent",
            "deviation_flag", "deviation_reason", "created_at", "updated_at",
        ]
        read_only_fields = ["deviation_flag", "created_at", "updated_at"]


class ActivityDependencySerializer(serializers.ModelSerializer):
    class Meta:
        model = ActivityDependency
        fields = ["id", "from_activity", "to_activity", "dependency_type", "created_at"]
        read_only_fields = ["id", "created_at"]


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

    class Meta:
        model = OutputDeliverable
        fields = [
            "id", "logframe_row", "title", "description",
            "target_quantity", "achieved_quantity", "unit",
            "due_date", "status", "status_display", "percent_achieved",
            "evidence_url", "created_at", "updated_at",
        ]


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

    class Meta:
        model = CorrectiveAction
        fields = [
            "id", "subject_type", "subject_id", "title", "root_cause",
            "action_plan", "owner", "due_date", "status", "status_display",
            "outcome_note", "created_by", "created_at", "updated_at", "closed_at",
        ]
        read_only_fields = ["id", "created_at", "updated_at", "closed_at"]
