"""WorkItem API serializers."""

from __future__ import annotations

from rest_framework import serializers

from simorgh.apps.workbox.models import WorkboxItem as WorkItem


class WorkItemSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(source="public_id", read_only=True)
    item_type_display = serializers.CharField(source="get_item_type_display", read_only=True)
    status_display = serializers.CharField(source="get_status_display", read_only=True)

    class Meta:
        model = WorkItem
        fields = (
            "id",
            "item_type",
            "item_type_display",
            "title",
            "summary",
            "description",
            "status",
            "status_display",
            "priority",
            "assigned_to_user",
            "assigned_to_role",
            "assigned_to_unit",
            "source_type",
            "source_entity",
            "source_id",
            "source_url",
            "due_date",
            "completed_at",
            "is_delegated",
            "metadata",
            "created_by",
            "created_at",
            "updated_at",
        )
        read_only_fields = fields


class WorkItemDetailSerializer(WorkItemSerializer):
    timeline = serializers.SerializerMethodField()

    class Meta(WorkItemSerializer.Meta):
        fields = (*WorkItemSerializer.Meta.fields, "timeline")

    def get_timeline(self, obj: WorkItem) -> list[dict]:
        from simorgh.apps.workbox.services import WorkItemService
        return WorkItemService.get_timeline(obj)


class WorkItemCreateSerializer(serializers.Serializer):
    item_type = serializers.ChoiceField(choices=(
        ("assignment", "Assignment"),
        ("approval", "Approval"),
        ("task", "Task"),
        ("workflow_step", "Workflow Step"),
        ("ticket", "Ticket"),
        ("review", "Review"),
        ("custom", "Custom"),
    ))
    title = serializers.CharField(max_length=500)
    summary = serializers.CharField(max_length=300, required=False, allow_blank=True, default="")
    description = serializers.CharField(required=False, allow_blank=True, default="")
    priority = serializers.ChoiceField(choices=(
        ("low", "Low"), ("medium", "Medium"), ("high", "High"), ("urgent", "Urgent"),
    ), default="medium")
    assigned_to_user_id = serializers.IntegerField(required=False, allow_null=True)
    assigned_to_role_id = serializers.IntegerField(required=False, allow_null=True)
    assigned_to_unit_id = serializers.IntegerField(required=False, allow_null=True)
    source_type = serializers.CharField(max_length=50, required=False, allow_blank=True, default="")
    source_entity = serializers.CharField(max_length=128, required=False, allow_blank=True, default="")
    source_id = serializers.CharField(max_length=64, required=False, allow_blank=True, default="")
    source_url = serializers.CharField(max_length=500, required=False, allow_blank=True, default="")
    due_date = serializers.DateTimeField(required=False, allow_null=True)
    is_delegated = serializers.BooleanField(default=False)
    metadata = serializers.DictField(required=False, default=dict)


class WorkItemCompleteSerializer(serializers.Serializer):
    note = serializers.CharField(max_length=1000, required=False, allow_blank=True, default="")


class WorkItemCancelSerializer(serializers.Serializer):
    note = serializers.CharField(max_length=1000, required=False, allow_blank=True, default="")


class WorkItemReassignSerializer(serializers.Serializer):
    to_user_id = serializers.IntegerField(required=False, allow_null=True)
    to_role_id = serializers.IntegerField(required=False, allow_null=True)
    to_unit_id = serializers.IntegerField(required=False, allow_null=True)
    note = serializers.CharField(max_length=1000, required=False, allow_blank=True, default="")


class WorkboxDashboardSerializer(serializers.Serializer):
    pending = serializers.IntegerField()
    in_progress = serializers.IntegerField()
    overdue = serializers.IntegerField()
    completed = serializers.IntegerField()
    cancelled = serializers.IntegerField()
    expired = serializers.IntegerField()
    delegated = serializers.IntegerField()
    today_due = serializers.IntegerField()
    total = serializers.IntegerField()


class WorkboxRefreshSerializer(serializers.Serializer):
    stats = serializers.DictField(child=serializers.IntegerField())
