from rest_framework import serializers
from .models import MasterAnnualCTC


class MasterAnnualCTCSerializer(serializers.ModelSerializer):
    created_by_email = serializers.EmailField(source="created_by.email", read_only=True)
    updated_by_email = serializers.EmailField(source="updated_by.email", read_only=True)

    class Meta:
        model = MasterAnnualCTC
        fields = [
            "id",
            "name",
            "status",
            "created_by",
            "created_by_email",
            "updated_by",
            "updated_by_email",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["id", "created_by", "updated_by", "created_at", "updated_at"]

    def validate_name(self, value: str) -> str:
        import re
        clean_value = (value or "").strip()
        if not clean_value:
            raise serializers.ValidationError("CTC range name cannot be empty.")

        # Disallow special characters except spaces, hyphens, en-dash, plus, and decimals
        if not re.match(r"^[a-zA-Z0-9\s.\-–+]+$", clean_value):
            raise serializers.ValidationError(
                "Special characters are not allowed in CTC range. Only numbers, letters, spaces, hyphens, plus and decimals are allowed."
            )

        # Normalize hyphens/dashes and whitespace for duplicate check
        norm = lambda s: re.sub(r"[\s\-–—]+", "-", s).lower()
        target_norm = norm(clean_value)

        qs = MasterAnnualCTC.objects.all()
        if self.instance:
            qs = qs.exclude(id=self.instance.id)

        for existing in qs:
            if norm(existing.name) == target_norm:
                raise serializers.ValidationError("A CTC range with this name already exists.")

        return clean_value

