from django.db import models
from people.models import Student, Teacher
from academics.models import StudentEnrollment  # Import from academics
from .utils.file_upload_paths import (
    transport_vehicle_upload_path,
    transport_vehicle_insurance_upload_path,
    transport_vehicle_permit_upload_path,
)


# -------------------------------
# 1. Transport Types
# -------------------------------
class TransportType(models.Model):
    name = models.CharField(max_length=50, unique=True)  # Bus, Van, Auto

    def __str__(self):
        return self.name


# -------------------------------
# 2. Transport Vehicles
# -------------------------------
class TransportVehicle(models.Model):
    transport_type = models.ForeignKey(TransportType, on_delete=models.CASCADE)
    vehicle_number = models.CharField(max_length=50, unique=True)  # TN01AB1234
    bus_number = models.CharField(max_length=20, unique=True)  # Bus No: 12
    driver_name = models.CharField(max_length=100)
    driver_phone = models.CharField(max_length=15)
    capacity = models.PositiveIntegerField()

    # Document Fields
    vehicle_photo = models.FileField(
        upload_to=transport_vehicle_upload_path,
        null=True,
        blank=True,
        help_text="Upload vehicle photo/image",
    )

    registration_certificate = models.FileField(
        upload_to=transport_vehicle_upload_path,
        null=True,
        blank=True,
        help_text="Upload vehicle registration certificate (RC)",
    )

    insurance_document = models.FileField(
        upload_to=transport_vehicle_insurance_upload_path,
        null=True,
        blank=True,
        help_text="Upload vehicle insurance document",
    )

    pollution_certificate = models.FileField(
        upload_to=transport_vehicle_upload_path,
        null=True,
        blank=True,
        help_text="Upload pollution under control certificate",
    )

    permit_document = models.FileField(
        upload_to=transport_vehicle_permit_upload_path,
        null=True,
        blank=True,
        help_text="Upload vehicle permit document",
    )

    fitness_certificate = models.FileField(
        upload_to=transport_vehicle_upload_path,
        null=True,
        blank=True,
        help_text="Upload vehicle fitness certificate",
    )

    def __str__(self):
        return f"{self.bus_number} - {self.vehicle_number}"


# -------------------------------
# 3. Routes (Start → Destination)
# -------------------------------
class Route(models.Model):
    vehicle = models.OneToOneField(TransportVehicle, on_delete=models.CASCADE)
    route_name = models.CharField(max_length=100)
    start_location = models.CharField(max_length=150)
    destination = models.CharField(max_length=150)
    distance_km = models.DecimalField(
        max_digits=6, decimal_places=2, null=True, blank=True
    )

    def __str__(self):
        return f"{self.route_name} ({self.start_location} → {self.destination})"


# -------------------------------
# 4. Stops (Intermediate Points)
# -------------------------------
class Stop(models.Model):
    route = models.ForeignKey(Route, on_delete=models.CASCADE, related_name="stops")
    stop_name = models.CharField(max_length=100)
    stop_order = models.PositiveIntegerField()  # Order of stop
    arrival_time = models.TimeField(null=True, blank=True)
    fee_amount = models.DecimalField(
        max_digits=8,
        decimal_places=2,
        default=0,
        help_text="Transport fee for students picked up at this stop",
    )

    class Meta:
        ordering = ["stop_order"]
        unique_together = ("route", "stop_order")

    def __str__(self):
        return f"{self.stop_name} ({self.route.route_name})"


# -------------------------------
# 5. Student Transport (Updated with enrollment_id)
# -------------------------------
class StudentTransport(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    enrollment = models.ForeignKey(
        StudentEnrollment,
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        related_name="transport_assignments",
    )  # Added enrollment referencae
    vehicle = models.ForeignKey(TransportVehicle, on_delete=models.CASCADE)
    route = models.ForeignKey(Route, on_delete=models.CASCADE)
    stop = models.ForeignKey(Stop, on_delete=models.SET_NULL, null=True, blank=True)

    pickup_point = models.CharField(max_length=150, null=True, blank=True)
    fee_amount = models.DecimalField(max_digits=8, decimal_places=2, default=0)
    due_date = models.DateField(
        null=True, blank=True, help_text="Due date for this student's transport fee"
    )
    is_active = models.BooleanField(default=True)

    # Additional fields for better tracking
    enrollment_number = models.CharField(
        max_length=50, null=True, blank=True
    )  # Denormalized for quick access
    academic_year = models.CharField(
        max_length=20, null=True, blank=True
    )  # e.g., "2024-2025"

    class Meta:
        unique_together = (
            "student",
            "enrollment",
            "vehicle",
        )  # Prevent duplicate assignments

    def __str__(self):
        enrollment_info = (
            f" (Enrollment: {self.enrollment_number})" if self.enrollment_number else ""
        )
        return f"{self.student} - {self.vehicle.bus_number}{enrollment_info}"

    def save(self, *args, **kwargs):
        # Auto-populate enrollment_number from enrollment if available
        if self.enrollment and not self.enrollment_number:
            self.enrollment_number = self.enrollment.enrollment_number
            if hasattr(self.enrollment, "academic_year"):
                self.academic_year = str(self.enrollment.academic_year)
        super().save(*args, **kwargs)


# -------------------------------
# 6. Teacher Transport
# -------------------------------
class TeacherTransport(models.Model):
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)
    vehicle = models.ForeignKey(TransportVehicle, on_delete=models.CASCADE)
    route = models.ForeignKey(Route, on_delete=models.CASCADE)
    stop = models.ForeignKey(Stop, on_delete=models.SET_NULL, null=True, blank=True)

    pickup_point = models.CharField(max_length=150, null=True, blank=True)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return f"{self.teacher} - {self.vehicle.bus_number}"
