from django.conf import settings
from django.db import models


class Vehicle(models.Model):
    class Status(models.TextChoices):
        AVAILABLE = "available", "Available"
        IN_USE = "in_use", "In use"
        MAINTENANCE = "maintenance", "Under maintenance"
        RETIRED = "retired", "Retired"

    class FuelType(models.TextChoices):
        PETROL = "petrol", "Petrol"
        DIESEL = "diesel", "Diesel"
        HYBRID = "hybrid", "Hybrid"
        ELECTRIC = "electric", "Electric"

    registration = models.CharField(max_length=20, unique=True)
    make = models.CharField(max_length=100)
    model = models.CharField(max_length=100)
    year = models.PositiveSmallIntegerField(null=True, blank=True)
    fuel_type = models.CharField(max_length=10, choices=FuelType.choices, default=FuelType.DIESEL)
    seating_capacity = models.PositiveSmallIntegerField(default=5)
    status = models.CharField(max_length=16, choices=Status.choices, default=Status.AVAILABLE)
    assigned_driver = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="assigned_vehicles",
    )
    insurance_expiry = models.DateField(null=True, blank=True)
    next_service_date = models.DateField(null=True, blank=True)
    notes = models.TextField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["registration"]

    def __str__(self):
        return f"{self.registration} — {self.make} {self.model}"


class VehicleBooking(models.Model):
    class Status(models.TextChoices):
        PENDING = "pending", "Pending"
        APPROVED = "approved", "Approved"
        REJECTED = "rejected", "Rejected"
        IN_PROGRESS = "in_progress", "In progress"
        COMPLETED = "completed", "Completed"
        CANCELLED = "cancelled", "Cancelled"

    vehicle = models.ForeignKey(Vehicle, on_delete=models.PROTECT, related_name="bookings")
    requested_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
        related_name="vehicle_bookings",
    )
    purpose = models.CharField(max_length=255)
    destination = models.CharField(max_length=255)
    departure_datetime = models.DateTimeField()
    return_datetime = models.DateTimeField()
    passengers = models.PositiveSmallIntegerField(default=1)
    status = models.CharField(max_length=16, choices=Status.choices, default=Status.PENDING)
    approved_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="vehicle_booking_approvals",
    )
    approved_at = models.DateTimeField(null=True, blank=True)
    notes = models.TextField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-departure_datetime"]

    def __str__(self):
        return f"{self.vehicle} / {self.requested_by} → {self.destination}"


class TripLog(models.Model):
    booking = models.OneToOneField(
        VehicleBooking, on_delete=models.CASCADE, related_name="trip_log"
    )
    driver = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
        related_name="trip_logs",
    )
    odometer_start = models.PositiveIntegerField(help_text="km at departure")
    odometer_end = models.PositiveIntegerField(null=True, blank=True, help_text="km on return")
    fuel_added_litres = models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True)
    fuel_cost = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    notes = models.TextField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    @property
    def distance_km(self):
        if self.odometer_end is not None:
            return self.odometer_end - self.odometer_start
        return None

    class Meta:
        ordering = ["-created_at"]

    def __str__(self):
        return f"Trip log: {self.booking}"


class MaintenanceRecord(models.Model):
    class MaintenanceType(models.TextChoices):
        SCHEDULED = "scheduled", "Scheduled service"
        REPAIR = "repair", "Repair"
        INSPECTION = "inspection", "Inspection"
        TYRE = "tyre", "Tyre change"
        OTHER = "other", "Other"

    vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE, related_name="maintenance_records")
    maintenance_type = models.CharField(
        max_length=16, choices=MaintenanceType.choices, default=MaintenanceType.SCHEDULED
    )
    date = models.DateField()
    odometer = models.PositiveIntegerField(null=True, blank=True, help_text="km at service")
    cost = models.DecimalField(max_digits=12, decimal_places=2, null=True, blank=True)
    service_provider = models.CharField(max_length=200, blank=True)
    description = models.TextField(blank=True)
    next_due_date = models.DateField(null=True, blank=True)
    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="+",
    )
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-date"]

    def __str__(self):
        return f"{self.vehicle} — {self.get_maintenance_type_display()} {self.date}"
