from rest_framework import serializers
from .models import Client, CompanyLinkedInConfig


class CompanyLinkedInConfigSerializer(serializers.ModelSerializer):
    client_name = serializers.CharField(source="client.name", read_only=True)
    has_token = serializers.SerializerMethodField()

    class Meta:
        model = CompanyLinkedInConfig
        fields = [
            "id", "client", "client_name", "access_token", "author_urn",
            "oauth_client_id", "oauth_client_secret", "is_active", "has_token", "updated_at",
        ]
        read_only_fields = ["id", "client_name", "has_token", "updated_at"]
        extra_kwargs = {
            "access_token": {"write_only": True, "required": False},
            "oauth_client_secret": {"write_only": True, "required": False},
        }

    def get_has_token(self, obj):
        return bool(obj.access_token)


class ClientSerializer(serializers.ModelSerializer):
    class Meta:
        model = Client
        fields = [
            "id",
            "name",
            "email",
            "phone",
            "website",
            "description",
            "created_at",
            "updated_at",
        ]
        read_only_fields = ["id", "created_at", "updated_at"]

    def validate_name(self, value):
        # The DB's unique constraint on `name` is case-sensitive, so "Google"
        # and "google" would otherwise both be accepted. Check case-insensitively
        # here, excluding the current instance on updates.
        name = value.strip()
        qs = Client.objects.filter(name__iexact=name)
        if self.instance:
            qs = qs.exclude(pk=self.instance.pk)
        if qs.exists():
            raise serializers.ValidationError("A client with this name already exists.")
        return name


class ClientListSerializer(ClientSerializer):
    """Bulk/list view — PII (phone/email) masked (DPDP). Detail keeps full values."""
    email = serializers.SerializerMethodField()
    phone = serializers.SerializerMethodField()

    def get_email(self, obj):
        from core.masking import mask_email
        return mask_email(obj.email)

    def get_phone(self, obj):
        from core.masking import mask_phone
        return mask_phone(obj.phone)
