"""Smoke tests for Fleet models — vehicle booking and maintenance records."""
from __future__ import annotations

import pytest
from django.contrib.auth import get_user_model
from django.utils import timezone

from apps.core.permissions.roles import UserRole
from apps.rims.fleet.models import MaintenanceRecord, TripLog, Vehicle, VehicleBooking

User = get_user_model()


@pytest.fixture
def driver_user(db):
    u = User.objects.create_user(email="driver@example.com", password="pw")
    u.role = UserRole.ADMIN
    u.save()
    return u


@pytest.fixture
def vehicle(db):
    return Vehicle.objects.create(
        registration="UAA 123B",
        make="Toyota",
        model="Land Cruiser",
        fuel_type=Vehicle.FuelType.DIESEL,
        seating_capacity=7,
    )


@pytest.mark.django_db
def test_vehicle_defaults_available(vehicle):
    assert vehicle.status == Vehicle.Status.AVAILABLE


@pytest.mark.django_db
def test_booking_created_pending(vehicle, driver_user):
    booking = VehicleBooking.objects.create(
        vehicle=vehicle,
        requested_by=driver_user,
        purpose="Field visit",
        destination="Kampala",
        departure_datetime=timezone.now(),
        return_datetime=timezone.now(),
    )
    assert booking.status == VehicleBooking.Status.PENDING


@pytest.mark.django_db
def test_trip_log_distance(vehicle, driver_user):
    booking = VehicleBooking.objects.create(
        vehicle=vehicle,
        requested_by=driver_user,
        purpose="Field visit",
        destination="Jinja",
        departure_datetime=timezone.now(),
        return_datetime=timezone.now(),
        status=VehicleBooking.Status.APPROVED,
    )
    log = TripLog.objects.create(
        booking=booking,
        driver=driver_user,
        odometer_start=10000,
        odometer_end=10080,
    )
    assert log.distance_km == 80


@pytest.mark.django_db
def test_maintenance_updates_next_service(vehicle, driver_user):
    from datetime import date
    next_date = date(2026, 12, 1)
    rec = MaintenanceRecord.objects.create(
        vehicle=vehicle,
        maintenance_type=MaintenanceRecord.MaintenanceType.SCHEDULED,
        date=date.today(),
        next_due_date=next_date,
        created_by=driver_user,
    )
    assert rec.vehicle == vehicle
    assert rec.next_due_date == next_date
