from django.contrib.auth.models import AbstractUser
from django.db import models
import uuid


class User(AbstractUser):
    ROLE_CHOICES = [
        ("CUSTOMER", "Customer"),
        ("HOTEL_OWNER", "Hotel Owner"),
        ("RESTAURANT_OWNER", "Restaurant Owner"),
        ("ADMIN", "Admin"),
        ("DELIVERY_PARTNER", "Delivery Partner"),
    ]

    role = models.CharField(
        max_length=20,
        choices=ROLE_CHOICES,
        default="CUSTOMER"
    )
    phone = models.CharField(max_length=15, blank=True, null=True)

    def __str__(self):
        return self.username


class DeliveryPartnerProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="delivery_profile")
    vehicle_type = models.CharField(max_length=50, blank=True, null=True)
    vehicle_number = models.CharField(max_length=50, blank=True, null=True)
    driving_license = models.CharField(max_length=50, blank=True, null=True)
    is_verified = models.BooleanField(default=False)

    def __str__(self):
        return f"{self.user.username} - Delivery Profile"


class UserSession(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="sessions")
    session_key = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)
    ip_address = models.GenericIPAddressField(null=True, blank=True)
    user_agent = models.TextField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    last_activity = models.DateTimeField(auto_now=True)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return f"{self.user.username} - {self.session_key} (Active: {self.is_active})"




class SessionConfiguration(models.Model):
    absolute_expiry_hours = models.IntegerField(default=87600)  # Default: 10 years
    inactivity_timeout_minutes = models.IntegerField(default=5256000)  # Default: 10 years
    max_sessions_per_user = models.IntegerField(default=5)  # Default: 5 sessions

    @classmethod
    def get_settings(cls):
        config, created = cls.objects.get_or_create(id=1)
        return config


def create_user_session(user, request=None):
    ip_address = None
    user_agent = ""
    if request:
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip_address = x_forwarded_for.split(',')[0].strip()
        else:
            ip_address = request.META.get('REMOTE_ADDR')
        user_agent = request.META.get('HTTP_USER_AGENT', '')
    
    # Enforce maximum active sessions
    config = SessionConfiguration.get_settings()
    active_sessions = UserSession.objects.filter(user=user, is_active=True).order_by('last_activity')
    if active_sessions.count() >= config.max_sessions_per_user:
        # Deactivate oldest sessions exceeding the limit
        excess_count = active_sessions.count() - config.max_sessions_per_user + 1
        sessions_to_revoke = active_sessions[:excess_count]
        for s in sessions_to_revoke:
            s.is_active = False
            s.save(update_fields=["is_active"])

    return UserSession.objects.create(
        user=user,
        ip_address=ip_address,
        user_agent=user_agent
    )
