from rest_framework import serializers

from .models import LLMProvider


class LLMProviderSerializer(serializers.ModelSerializer):
    # write-only plaintext key input; never echoed back
    api_key = serializers.CharField(write_only=True, required=False, allow_blank=True)
    api_key_masked = serializers.CharField(read_only=True)
    has_key = serializers.SerializerMethodField()
    provider_label = serializers.CharField(source="get_provider_display", read_only=True)

    class Meta:
        model = LLMProvider
        fields = [
            "id", "name", "provider", "provider_label", "base_url", "model",
            "max_tokens", "temperature", "is_active", "is_default",
            "api_key", "api_key_masked", "has_key", "created_at", "updated_at",
        ]

    def get_has_key(self, obj):
        return bool(obj.api_key_encrypted)

    def create(self, validated_data):
        raw = validated_data.pop("api_key", "")
        obj = LLMProvider(**validated_data)
        if raw:
            obj.set_api_key(raw)
        obj.created_by = self.context["request"].user
        obj.save()
        return obj

    def update(self, instance, validated_data):
        raw = validated_data.pop("api_key", None)
        for k, v in validated_data.items():
            setattr(instance, k, v)
        if raw:  # only replace the key when a new one is supplied
            instance.set_api_key(raw)
        instance.save()
        return instance
