"""Schemas for Heavy Equipment & Fleet Fuel Telematics."""

from __future__ import annotations

from datetime import date
from decimal import Decimal
from enum import Enum

from pydantic import BaseModel, Field


class EquipmentTypeEnum(str, Enum):
    EXCAVATOR = "EXCAVATOR"  # Máy đào bánh xích (Komatsu, Kobelco)
    DUMP_TRUCK = "DUMP_TRUCK"  # Xe ben tự đổ Howo 4 chân
    ROLLER = "ROLLER"  # Xe lu rung
    BULLDOZER = "BULLDOZER"  # Máy ủi
    OTHER = "OTHER"


class FuelLogCreateRequest(BaseModel):
    equipment_code: str
    log_date: date
    project_code: str | None = None
    shift_hours: Decimal
    fuel_liters_dispensed: Decimal
    dispensed_by: str
    receipt_number: str | None = None
    odometer_km: Decimal | None = None
    engine_hours: Decimal | None = None
    notes: str | None = None


class FuelEfficiencyAssessment(BaseModel):
    equipment_code: str
    equipment_name: str
    equipment_type: EquipmentTypeEnum
    standard_norm_per_hour: Decimal  # Định mức tiêu chuẩn L/h theo TT ĐTXD 2026
    actual_liters_per_hour: Decimal  # Tiêu hao thực tế L/h
    variance_percentage: Decimal  # Độ lệch %
    status: str = "NORMAL"  # NORMAL, WARNING_OVERCONSUMPTION (>15%), CRITICAL (>25%)
    recommendation: str | None = None


class MaintenanceScheduleRecord(BaseModel):
    equipment_code: str
    equipment_name: str
    last_maintenance_date: date | None = None
    last_maintenance_hours: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    current_engine_hours: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    next_maintenance_due_hours: Decimal = Field(
        default_factory=lambda: Decimal("250.0000")
    )
    hours_remaining: Decimal = Field(default_factory=lambda: Decimal("250.0000"))
    inspection_expiry_date: date | None = None  # Hạn đăng kiểm
    insurance_expiry_date: date | None = None  # Hạn bảo hiểm
    is_inspection_urgent: bool = False
    is_maintenance_due: bool = False


class FuelTelematicsDashboardData(BaseModel):
    as_of_date: date
    total_active_equipment: int
    total_fuel_consumed_liters: Decimal = Field(
        default_factory=lambda: Decimal("0.0000")
    )
    total_operating_hours: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    average_consumption_liters_per_hour: Decimal = Field(
        default_factory=lambda: Decimal("0.0000")
    )
    assessments: list[FuelEfficiencyAssessment] = Field(default_factory=list)
    maintenance_schedules: list[MaintenanceScheduleRecord] = Field(default_factory=list)
