from rest_framework import serializers

class ProfilePhotoUploadSerializer(serializers.Serializer):
    image = serializers.ImageField(write_only=True)

    def validate_image(self, img):
        # Size limit (2 MB)
        max_bytes = 2 * 1024 * 1024
        if img.size > max_bytes:
            raise serializers.ValidationError("Image too large (max 2MB).")
        # Content-type check
        valid_ct = {"image/jpeg", "image/png", "image/webp"}
        if getattr(img, "content_type", None) not in valid_ct:
            raise serializers.ValidationError("Only JPEG/PNG/WEBP allowed.")
        return img

# users/serializers.py
# from rest_framework import serializers
# from .models import CustomUser

# class CustomUserSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = CustomUser
#         fields = "__all__"
#         # Optional: block pin changes via this API
#         read_only_fields = ("login_pin", "transaction_pin", "date_joined", "pins_set_at", "pins_email_sent_at")


# users/serializers.py
from rest_framework import serializers
from .models import CustomUser
from accounts.models import State, District  # adjust to your app label

class CustomUserSerializer(serializers.ModelSerializer):
    referred_by_mobile = serializers.SerializerMethodField()
    state_name = serializers.SerializerMethodField()
    district_name = serializers.SerializerMethodField()

    class Meta:
        model = CustomUser
        # Do NOT expose these in any response
        exclude = (
            # "login_pin",
            # "transaction_pin",
            "pins_set_at",
            "pins_email_sent_at",
        )
        # These are fine to receive on write (e.g., registration) but won't show in responses
        extra_kwargs = {
            "login_pin": {"write_only": True},
            "transaction_pin": {"write_only": True},
        }
    def get_referred_by_mobile(self, obj):
        return getattr(obj.referred_by, "mobile_number", None)

    def get_state_name(self, obj):
        # if the saved value looks like an integer id, resolve to State.name; else return as-is
        val = (obj.state or "").strip()
        if val.isdigit():
            st = State.objects.filter(id=int(val)).values_list("name", flat=True).first()
            return st or val
        return val

    def get_district_name(self, obj):
        val = (obj.district or "").strip()
        if val.isdigit():
            # resolve by id
            dist = District.objects.filter(id=int(val)).values_list("name", flat=True).first()
            return dist or val
        return val
