from rest_framework import serializers
from django.contrib.auth.password_validation import validate_password
from .models import User, PlaceAdmin


class UserSerializer(serializers.ModelSerializer):
    """User Serializer"""
    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'phone', 'avatar', 'role', 'is_verified',
                  'language', 'theme', 'notifications_enabled', 'created_at']
        read_only_fields = ['id', 'role', 'is_verified', 'created_at']


class UserRegistrationSerializer(serializers.ModelSerializer):
    """User Registration Serializer"""
    password = serializers.CharField(write_only=True, required=True, validators=[validate_password])
    password2 = serializers.CharField(write_only=True, required=True)

    class Meta:
        model = User
        fields = ['username', 'email', 'phone', 'password', 'password2', 'language']

    def validate(self, attrs):
        if attrs['password'] != attrs['password2']:
            raise serializers.ValidationError({"password": "Password fields didn't match."})
        return attrs

    def create(self, validated_data):
        validated_data.pop('password2')
        password = validated_data.pop('password')
        user = User.objects.create(**validated_data)
        user.set_password(password)
        user.save()
        return user


class UserProfileSerializer(serializers.ModelSerializer):
    """User Profile Serializer"""
    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'phone', 'avatar', 'first_name', 'last_name',
                  'language', 'theme', 'notifications_enabled', 'fcm_token']
        read_only_fields = ['id', 'username']


class ChangePasswordSerializer(serializers.Serializer):
    """Change Password Serializer"""
    old_password = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True, validators=[validate_password])
    new_password2 = serializers.CharField(required=True)

    def validate(self, attrs):
        if attrs['new_password'] != attrs['new_password2']:
            raise serializers.ValidationError({"new_password": "Password fields didn't match."})
        return attrs


class PasswordResetSerializer(serializers.Serializer):
    """Password Reset Request Serializer"""
    email = serializers.EmailField(required=True)


class PasswordResetConfirmSerializer(serializers.Serializer):
    """Password Reset Confirm Serializer"""
    token = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True, validators=[validate_password])
    new_password2 = serializers.CharField(required=True)

    def validate(self, attrs):
        if attrs['new_password'] != attrs['new_password2']:
            raise serializers.ValidationError({"new_password": "Password fields didn't match."})
        return attrs


class EmailVerificationSerializer(serializers.Serializer):
    """Email Verification Serializer"""
    email = serializers.EmailField(required=True)


class EmailVerificationConfirmSerializer(serializers.Serializer):
    """Email Verification Confirm Serializer"""
    email = serializers.EmailField(required=True)
    code = serializers.CharField(required=True, max_length=6)


class PhoneVerificationSerializer(serializers.Serializer):
    """Phone Verification Serializer"""
    phone = serializers.CharField(required=True)


class PhoneVerificationConfirmSerializer(serializers.Serializer):
    """Phone Verification Confirm Serializer"""
    phone = serializers.CharField(required=True)
    code = serializers.CharField(required=True, max_length=6)


class GoogleLoginSerializer(serializers.Serializer):
    """Google OAuth Login Serializer"""
    id_token = serializers.CharField(required=True)
    access_token = serializers.CharField(required=False, allow_blank=True)


class PlaceAdminSerializer(serializers.ModelSerializer):
    """Place Admin Serializer"""
    user = UserSerializer(read_only=True)
    place_name = serializers.CharField(source='place.name', read_only=True)

    class Meta:
        model = PlaceAdmin
        fields = ['id', 'user', 'place', 'place_name', 'can_manage_bookings',
                  'can_manage_reviews', 'can_manage_offers', 'can_manage_place_info',
                  'created_at']
        read_only_fields = ['id', 'created_at']
