"""Serializers for the app_settings API."""

from __future__ import annotations

from rest_framework import serializers

from simorgh.apps.app_settings.models import SettingValue
from simorgh.apps.app_settings.registry import SettingDefinition


class SettingDefinitionSerializer(serializers.Serializer):
    key = serializers.CharField(read_only=True)
    type = serializers.CharField(read_only=True)
    default = serializers.JSONField(read_only=True)
    label_key = serializers.CharField(read_only=True)
    description_key = serializers.CharField(read_only=True, allow_blank=True)
    scopes = serializers.ListField(child=serializers.CharField(), read_only=True)
    resolved_value = serializers.JSONField(read_only=True)
    overrides = serializers.ListField(child=serializers.DictField(), read_only=True)

    def to_representation(self, definition: SettingDefinition) -> dict:
        data = {
            "key": definition.key,
            "type": definition.type,
            "default": definition.default,
            "label_key": definition.label_key,
            "description_key": definition.description_key,
            "scopes": list(definition.scopes),
        }
        if hasattr(definition, "_resolved_value"):
            data["resolved_value"] = definition._resolved_value
        if hasattr(definition, "_overrides"):
            data["overrides"] = definition._overrides
        return data


class SettingValueSerializer(serializers.ModelSerializer):
    class Meta:
        model = SettingValue
        fields = ("id", "key", "scope", "scope_id", "value", "updated_at", "updated_by")
        read_only_fields = ("id", "updated_at")


class SettingOverrideInputSerializer(serializers.Serializer):
    scope = serializers.ChoiceField(choices=["system", "tenant", "org", "module", "user"])
    scope_id = serializers.CharField(required=False, allow_blank=True, default="")
    value = serializers.JSONField()


class BulkResolveInputSerializer(serializers.Serializer):
    keys = serializers.ListField(
        child=serializers.CharField(), min_length=1, max_length=100
    )


class BulkResolveOutputSerializer(serializers.Serializer):
    key = serializers.CharField(read_only=True)
    type = serializers.CharField(read_only=True)
    resolved_value = serializers.JSONField(read_only=True)
    default = serializers.JSONField(read_only=True)


class BulkSetInputSerializer(serializers.Serializer):
    settings = serializers.ListField(
        child=serializers.DictField(), min_length=1, max_length=100
    )
