from rest_framework import serializers
from rest_framework.exceptions import ValidationError

from .models import CustomerBuyer
from core.utils import get_or_create_app_settings


class BuyerWriteSerializer(serializers.ModelSerializer):
    """
    Handles creation and update of buyers.
    - Validates duplicate name per customer (case-insensitive)
    - Optional set_default flag updates AppSettings.default_buyer
    """
    set_default = serializers.BooleanField(write_only=True, required=False, default=False)

    class Meta:
        model = CustomerBuyer
        fields = ["id", "name", "description", "set_default"]

    def validate_name(self, value):
        """
        Duplicate name check (case-insensitive) per customer.
        Raises ValidationError under 'name' with code 'duplicate-buyer-name'.
        """
        request = self.context.get("request")
        if request is None or not getattr(request, "user", None):
            return value

        customer = getattr(request.user, "customer", None)
        if customer is None:
            raise ValidationError(
                "Authenticated user is not linked to a customer profile.",
                code="no-customer-profile",
            )

        qs = CustomerBuyer.objects.filter(customer=customer, name__iexact=value)

        # Exclude self when updating
        if self.instance is not None:
            qs = qs.exclude(pk=self.instance.pk)

        if qs.exists():
            raise ValidationError(
                "You already have a buyer with this name.",
                code="duplicate-buyer-name",
            )

        return value

    def _maybe_set_default_buyer(self, buyer, set_default: bool):
        if not set_default:
            return

        settings = get_or_create_app_settings(buyer.customer)
        settings.default_buyer = {"id": buyer.id, "name": buyer.name}

        if hasattr(settings, "updated_at"):
            settings.save(update_fields=["default_buyer", "updated_at"])
        else:
            settings.save(update_fields=["default_buyer"])

    def create(self, validated_data):
        set_default = validated_data.pop("set_default", False)
        customer = self.context["request"].user.customer

        buyer = CustomerBuyer.objects.create(customer=customer, **validated_data)
        self._maybe_set_default_buyer(buyer, set_default)
        return buyer

    def update(self, instance, validated_data):
        set_default = validated_data.pop("set_default", False)
        instance = super().update(instance, validated_data)
        self._maybe_set_default_buyer(instance, set_default)
        return instance


class BuyerReadSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomerBuyer
        fields = ["id", "name", "description", "created_at", "updated_at"]
