# apps/users/manager.py
from django.contrib.auth.base_user import BaseUserManager
from django.db.models import Q
from django.utils import timezone
from datetime import timedelta
import random

class UserManagerEmail(BaseUserManager):
    
    def create_user(self, email, password=None, **extra_fields):
        """Create and save a regular user with email"""
        if not email:
            raise ValueError("Email is required")
        
        # Normalize email
        email = self.normalize_email(email)
        
        # Check if user already exists
        if self.filter(email__iexact=email).exists():
            raise ValueError("User with this email already exists")
        
        # Set defaults for normal user
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        extra_fields.setdefault('is_active', False)  # Active after OTP verification
        extra_fields.setdefault('is_email_verified', False)
        extra_fields.setdefault('role', 'user')
        
        # Create user
        user = self.model(email=email, **extra_fields)
        
        # Set password
        if password:
            user.set_password(password)
        else:
            user.set_unusable_password()
        
        # Generate OTP for new users (only non-superusers)
        if not extra_fields.get('is_superuser', False):
            user.otp = str(random.randint(100000, 999999))
            user.otp_expires_at = timezone.now() + timedelta(minutes=5)
        
        user.save(using=self._db)
        return user
    
    def create_superuser(self, email, password=None, **extra_fields):
        """Create and save a SuperUser with email"""
        # Set superuser defaults
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)  # Active immediately
        extra_fields.setdefault('is_email_verified', True)  # Auto-verified
        extra_fields.setdefault('role', 'admin')
        
        # No OTP for superusers
        extra_fields.setdefault('otp', None)
        extra_fields.setdefault('otp_expires_at', None)
        
        return self.create_user(email, password, **extra_fields)
    
    def get_by_natural_key(self, username):
        """Find user by email"""
        return self.get(email__iexact=username)