from rest_framework import serializers
from django.contrib.auth import get_user_model

User = get_user_model()


class CustomerRegisterSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)

    class Meta:
        model = User
        fields = [
            'username',
            'password',
            'email',
            'building',
            'office',
            'phone_number',
            'employee_id',
            'employee_id_image'
        ]

    def to_internal_value(self, data):
        mutable = data.copy()
        # Accept legacy misspelled key from older frontend payloads.
        if 'building' not in mutable and 'bulding' in mutable:
            mutable['building'] = mutable.get('bulding')
        return super().to_internal_value(mutable)

    def validate(self, data):
        if not data.get('employee_id'):
            raise serializers.ValidationError("Employee ID is required.")

        if not data.get('phone_number'):
            raise serializers.ValidationError("Phone number is required.")

        if not data.get('employee_id_image'):
            raise serializers.ValidationError("Employee ID image is required.")

        duplicate_errors = {}
        username = str(data.get('username') or '').strip()
        email = str(data.get('email') or '').strip()
        employee_id = str(data.get('employee_id') or '').strip()

        if username and User.objects.filter(username__iexact=username).exists():
            duplicate_errors['username'] = ["This username is already in use."]
        if email and User.objects.filter(email__iexact=email).exists():
            duplicate_errors['email'] = ["This email is already in use."]
        if employee_id and User.objects.filter(employee_id=employee_id).exists():
            duplicate_errors['employee_id'] = ["This employee ID is already in use."]

        if duplicate_errors:
            raise serializers.ValidationError(duplicate_errors)

        return data

    def create(self, validated_data):
        user = User.objects.create_user(
            username=validated_data['username'],
            password=validated_data['password'],
            email=validated_data.get('email'),
            role='CUSTOMER',
            building=validated_data.get('building'),
            office=validated_data.get('office'),
            phone_number=validated_data.get('phone_number'),
            employee_id=validated_data.get('employee_id'),
            employee_id_image=validated_data.get('employee_id_image'),
            is_approved=False,   # 🔥 NOT APPROVED YET
            is_active=False      # 🔥 CANNOT LOGIN
        )

        return user
