"""Schemas for Mobile Site Operations & Material Requisition (MR)."""

from __future__ import annotations

from datetime import date, datetime
from decimal import Decimal
from enum import Enum

from pydantic import BaseModel, Field


class MRStatusEnum(str, Enum):
    DRAFT = "DRAFT"
    SUBMITTED = "SUBMITTED"
    APPROVED = "APPROVED"
    REJECTED = "REJECTED"
    FULFILLED = "FULFILLED"


class MaterialRequisitionItem(BaseModel):
    item_code: str
    material_name: str
    unit: str
    requested_qty: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    approved_qty: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    unit_price_estimate: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    notes: str | None = None


class MaterialRequisitionCreateRequest(BaseModel):
    project_code: str
    wbs_task_code: str | None = None
    urgency: str = "NORMAL"  # LOW, NORMAL, HIGH, EMERGENCY
    required_date: date
    requester_name: str
    items: list[MaterialRequisitionItem]
    delivery_location: str
    reason: str


class MaterialRequisitionRecord(BaseModel):
    mr_id: str
    project_code: str
    project_name: str
    wbs_task_code: str | None = None
    urgency: str
    status: MRStatusEnum
    required_date: date
    requester_name: str
    approver_name: str | None = None
    approval_timestamp: datetime | None = None
    total_estimated_amount: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    items: list[MaterialRequisitionItem] = Field(default_factory=list)
    created_at: datetime
    updated_at: datetime


class GPSPhotoAttachment(BaseModel):
    photo_id: str
    file_url: str
    latitude: float
    longitude: float
    accuracy_meters: float | None = None
    captured_at: datetime
    wbs_task_code: str | None = None
    caption: str | None = None


class MachineHourEntry(BaseModel):
    equipment_code: str
    equipment_name: str
    operator_name: str
    start_engine_hours: Decimal
    end_engine_hours: Decimal
    total_operating_hours: Decimal
    work_description: str


class AttendanceEntry(BaseModel):
    employee_code: str
    employee_name: str
    role_title: str
    shift: str = "FULL_DAY"  # MORNING, AFTERNOON, NIGHT, FULL_DAY
    hours_worked: Decimal = Field(default_factory=lambda: Decimal("8.0000"))
    check_in_time: datetime | None = None


class SiteDiaryCreateRequest(BaseModel):
    project_code: str
    log_date: date
    weather_condition: str  # SUNNY, RAIN, OVERCAST, STORM
    temperature_celsius: float | None = None
    engineer_name: str
    site_manager_name: str | None = None
    work_summary: str
    safety_incidents: str | None = "Không có sự cố an toàn"
    attendance: list[AttendanceEntry] = Field(default_factory=list)
    machine_logs: list[MachineHourEntry] = Field(default_factory=list)
    photos: list[GPSPhotoAttachment] = Field(default_factory=list)


class SiteDiaryRecord(BaseModel):
    diary_id: str
    project_code: str
    project_name: str
    log_date: date
    weather_condition: str
    temperature_celsius: float | None = None
    engineer_name: str
    site_manager_name: str | None = None
    work_summary: str
    safety_incidents: str | None = None
    total_workers: int = 0
    total_machine_hours: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    attendance: list[AttendanceEntry] = Field(default_factory=list)
    machine_logs: list[MachineHourEntry] = Field(default_factory=list)
    photos: list[GPSPhotoAttachment] = Field(default_factory=list)
    created_at: datetime
