"""
REST API Serializers for User Management
"""
from rest_framework import serializers
from django.contrib.auth.password_validation import validate_password
from .models import User, Address, Wishlist


class UserSerializer(serializers.ModelSerializer):
    """User serializer with password handling"""
    
    password = serializers.CharField(
        write_only=True,
        required=True,
        validators=[validate_password]
    )
    password2 = serializers.CharField(write_only=True, required=True)
    
    class Meta:
        model = User
        fields = (
            'id', 'email', 'password', 'password2', 'first_name',
            'last_name', 'phone', 'role', 'profile_picture',
            'date_of_birth', 'address', 'city', 'state',
            'country', 'pincode', 'is_verified', 'created_at'
        )
        read_only_fields = ('id', 'is_verified', 'created_at', 'role')
    
    def validate(self, attrs):
        if attrs.get('password') != attrs.get('password2'):
            raise serializers.ValidationError(
                {"password": "Password fields didn't match."}
            )
        return attrs
    
    def create(self, validated_data):
        validated_data.pop('password2')
        user = User.objects.create_user(**validated_data)
        return user


class UserProfileSerializer(serializers.ModelSerializer):
    """User profile serializer (without password)"""
    
    full_name = serializers.CharField(read_only=True)
    is_admin = serializers.BooleanField(read_only=True)
    is_staff_member = serializers.BooleanField(read_only=True)
    
    class Meta:
        model = User
        fields = (
            'id', 'email', 'first_name', 'last_name', 'full_name',
            'phone', 'role', 'profile_picture', 'date_of_birth',
            'address', 'city', 'state', 'country', 'pincode',
            'is_verified', 'is_admin', 'is_staff_member',
            'created_at', 'updated_at'
        )
        read_only_fields = (
            'id', 'email', 'role', 'is_verified',
            'created_at', 'updated_at'
        )


class AddressSerializer(serializers.ModelSerializer):
    """Address serializer"""
    
    class Meta:
        model = Address
        fields = (
            'id', 'user', 'full_name', 'phone', 'address_line1',
            'address_line2', 'city', 'state', 'country',
            'pincode', 'is_default', 'created_at'
        )
        read_only_fields = ('id', 'user', 'created_at')


class WishlistSerializer(serializers.ModelSerializer):
    """Wishlist serializer"""
    
    product_details = serializers.SerializerMethodField()
    
    class Meta:
        model = Wishlist
        fields = ('id', 'user', 'product', 'product_details', 'added_at')
        read_only_fields = ('id', 'user', 'added_at')
    
    def get_product_details(self, obj):
        from products.serializers import ProductListSerializer
        return ProductListSerializer(obj.product).data


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
