from rest_framework import serializers

from services.receipt_service import handle_structure_invoicing_settings_change

from .models import Structure


class StructureInvoiceSettingsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Structure
        fields = [
            "id",
            "invoicing_enabled",
            "receipt_prefix",
            "invoice_prefix",
            "default_vat_rate",
        ]
        read_only_fields = ["id"]

    def validate_receipt_prefix(self, value):
        value = (value or "").strip()
        if not value:
            raise serializers.ValidationError("Receipt prefix cannot be blank.")
        return value

    def validate_invoice_prefix(self, value):
        value = (value or "").strip()
        if not value:
            raise serializers.ValidationError("Invoice prefix cannot be blank.")
        return value

    def update(self, instance, validated_data):
        previous_invoicing_enabled = instance.invoicing_enabled
        previous_default_vat_rate = instance.default_vat_rate
        instance._skip_receipt_sync = True
        instance._skip_receipt_backfill_signal = True
        try:
            updated_instance = super().update(instance, validated_data)
        finally:
            instance._skip_receipt_sync = False
        handle_structure_invoicing_settings_change(
            updated_instance,
            previous_invoicing_enabled=previous_invoicing_enabled,
            previous_default_vat_rate=previous_default_vat_rate,
        )
        return updated_instance
