from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.utils import timezone
from django.contrib.gis.db import models as geomodels
import os

class CustomUserManager(BaseUserManager):
    def create_superuser(self, mobile_number, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self.create_user(mobile_number, password, **extra_fields)


    def create_user(self, mobile_number,password=None, **extra_fields):
        if not mobile_number:
            raise ValueError("Mobile number must be set")
        user = self.model(mobile_number=mobile_number, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_driver(self, mobile_number, full_name, email=None, age=None, gender=None, license_number=None):
        # Create a driver user
        driver = self.create_user(mobile_number, full_name=full_name, email=email, age=age, gender=gender)
        driver.license_number = license_number
        driver.is_driver = True
        driver.save(using=self._db)
        return driver

    # Add similar methods for regular users if needed

def file_upload_path(instance,filename):
    app_name = instance._meta.app_label
    model_name = instance._meta.model_name
    path = os.path.join(app_name,model_name,filename)
    return path

class CustomUser(AbstractBaseUser,PermissionsMixin):
    mobile_number = models.CharField(max_length=15, unique=True)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100, null=True)
    employer = models.CharField(max_length=100, null=True)
    email = models.EmailField(blank=True, null=True)
    age = models.PositiveIntegerField(blank=True, null=True)
    gender = models.CharField(max_length=10, blank=True, null=True)
    license_number = models.CharField(max_length=20, blank=True, null=True, unique=True)
    is_verified = models.BooleanField(default=False)
    objects = CustomUserManager()
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_driver = models.BooleanField(default=False)
    verification_token = models.UUIDField(null=True, blank=True, unique=True)
    token_created_at = models.DateTimeField(null=True, blank=True)
    profile_pic = models.ImageField(upload_to = file_upload_path, default="default.jpeg",null=True, blank=True,)
    

    USERNAME_FIELD = "mobile_number"
    REQUIRED_FIELDS = []


    def save(self, *args, **kwargs):
        if not self.token_created_at and self.verification_token:
            self.token_created_at = timezone.now()
        super(CustomUser, self).save(*args, **kwargs)

    def __str__(self):
        return self.mobile_number
    
class OTP(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    otp_code = models.CharField(max_length=6) # 6-digit OTP
    is_verified = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)


class DriverLocation(models.Model):
    driver = models.OneToOneField(CustomUser, on_delete=models.CASCADE, related_name='location')
    last_known_location = geomodels.PointField(geography=True)
    timestamp = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.driver.mobile_number} - {self.last_known_location}"

class Device(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='devices')
    device_token = models.CharField(max_length=255, unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.user.mobile_number} - {self.device_token}"