from django.db import models
from accounts.models import CustomUser
from django.utils import timezone
from accounts.models import file_upload_path



class VehicleType(models.Model):
    """
    Model to store vehicle types along with seating capacity and fare details.
    """
    vehicle_type = models.CharField(max_length=50)
    seating_capacity = models.PositiveIntegerField()
    base_fare = models.DecimalField(max_digits=6, decimal_places=2, null=True, blank=True)
    per_km_charge = models.DecimalField(max_digits=6, decimal_places=2, null=True, blank=True)
    shared_percent = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)
    fare_per_km_per_seat = models.DecimalField(max_digits=6, decimal_places=2, null=True, blank=True)
    vehicletype_model = models.ImageField(upload_to=file_upload_path, default="default.jpeg", null=True, blank=True)

    def __str__(self):
        return self.vehicle_type


class Vehicle(models.Model):
    """
    Model to represent individual vehicles.
    """
    vehicle_type = models.ForeignKey(VehicleType, on_delete=models.CASCADE)
    status = models.BooleanField(default=False) 
    plate_number = models.CharField(max_length=10, unique=True)
    vehicle_pic = models.ImageField(upload_to= file_upload_path, default="default.jpeg",null=True, blank=True,)
    
    def __str__(self):
        return f"{self.vehicle_type} - {self.plate_number}"
    
    def set_active(self, driver):
        self.status = True
        self.save()
        VehicleAssignment.objects.create(driver=driver, vehicle=self, active=True)

    def set_inactive(self):
        self.status = False
        self.save()
        VehicleAssignment.objects.filter(vehicle=self, active=True).update(active=False, released_at=timezone.now())



class VehicleAssignment(models.Model):
    driver = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='assigned_vehicles')
    vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE, related_name='assignments')
    active = models.BooleanField(default=False) # True if the driver is currently using this vehicle
    assigned_at = models.DateTimeField(auto_now_add=True)
    released_at = models.DateTimeField(null=True, blank=True)
    on_ride = models.BooleanField(default=False)

    def __str__(self):
        return f"{self.vehicle.plate_number} assigned to {self.driver.mobile_number}"