# apps/users/serializers/otp.py
from rest_framework import serializers
from django.utils import timezone
from apps.users.models import User
from apps.core.utils import validate_and_normalize_email


class OTPSendSerializer(serializers.Serializer):
    email = serializers.EmailField(required=True)
    
    def validate_email(self, value):
        """Validate email and check if user exists"""
        try:
            normalized_email = validate_and_normalize_email(value)
            user = User.objects.get(email__iexact=normalized_email)
        except User.DoesNotExist:
            raise serializers.ValidationError("User with this email does not exist")
        
        # Check if email is already verified
        if user.is_email_verified:
            raise serializers.ValidationError("Email is already verified")
        
        return normalized_email
    
    def validate(self, data):
        """Get user object and add to data"""
        email = data.get('email')
        
        try:
            user = User.objects.get(email__iexact=email)
            data['user'] = user
        except User.DoesNotExist:
            raise serializers.ValidationError("User not found")
        
        return data


class OTPVerifySerializer(serializers.Serializer):
    email = serializers.EmailField(required=True)
    otp = serializers.CharField(
        required=True,
        min_length=6,
        max_length=6,
        help_text="6-digit OTP",
        trim_whitespace=True
    )
    
    def validate_email(self, value):
        """Validate and normalize email"""
        try:
            normalized_email = validate_and_normalize_email(value)
            return normalized_email
        except Exception:
            raise serializers.ValidationError("Invalid email format")
    
    def validate(self, data):
        """Validate OTP"""
        email = data.get('email')
        otp = data.get('otp')
        
        try:
            user = User.objects.get(email__iexact=email)
        except User.DoesNotExist:
            raise serializers.ValidationError("User not found")
        
        # Check if user has OTP
        if not user.otp:
            raise serializers.ValidationError("No OTP found. Please request a new OTP")
        
        # Check if OTP matches
        if user.otp != otp:
            raise serializers.ValidationError("Invalid OTP")
        
        # Check if OTP has expired
        if not user.otp_expires_at:
            raise serializers.ValidationError("OTP has expired. Please request a new OTP")
        
        if user.otp_expires_at < timezone.now():
            raise serializers.ValidationError("OTP has expired. Please request a new OTP")
        
        # Check if already verified
        if user.is_email_verified:
            raise serializers.ValidationError("Email is already verified")
        
        data['user'] = user
        return data


class OTPResendSerializer(serializers.Serializer):
    email = serializers.EmailField(required=True)
    
    def validate_email(self, value):
        """Validate email and check if user exists"""
        try:
            normalized_email = validate_and_normalize_email(value)
            user = User.objects.get(email__iexact=normalized_email)
        except User.DoesNotExist:
            raise serializers.ValidationError("User with this email does not exist")
        
        # Check if email is already verified
        if user.is_email_verified:
            raise serializers.ValidationError("Email is already verified")
        
        return normalized_email
    
    def validate(self, data):
        """Get user object and add to data"""
        email = data.get('email')
        
        try:
            user = User.objects.get(email__iexact=email)
            data['user'] = user
        except User.DoesNotExist:
            raise serializers.ValidationError("User not found")
        
        return data