from __future__ import annotations

from datetime import date
from decimal import Decimal

from app.models.four_pillars_schemas import (
    DispatchOrderCreateRequest,
    DispatchOrderRecord,
    DispatchOrderStatus,
    SludgeTransportReconciliation,
)


class LogisticsPillarMixin:
    """Trụ cột 2: Dịch vụ Vận tải Xe Ben & Logistics Cơ Giới."""

    def create_dispatch_order(
        self, request: DispatchOrderCreateRequest
    ) -> DispatchOrderRecord:
        """Tạo lệnh điều xe ben Howo vận chuyển bùn nạo vét / vật liệu."""
        today = date.today()
        # Định mức tiêu hao dầu xe Howo 4 chân: 24 Lít / chuyến hoặc 24L / giờ
        std_fuel = (Decimal(request.scheduled_trips) * Decimal("24.0000")).quantize(
            Decimal("0.0001")
        )
        actual_fuel = (std_fuel * Decimal("1.0200")).quantize(
            Decimal("0.0001")
        )  # Thực tế lệch 2%
        var_pct = Decimal("2.0000")

        return DispatchOrderRecord(
            order_code=f"DISP-{today.strftime('%Y%m%d')}-{request.truck_plate.replace('-', '').replace('.', '')[-4:]}",
            dispatch_date=today,
            truck_plate=request.truck_plate,
            driver_name=request.driver_name,
            partner_tax_id=request.partner_tax_id,
            partner_name=request.partner_name,
            cargo_type=request.cargo_type,
            source_location=request.source_location,
            dump_location=request.dump_location,
            scheduled_trips=request.scheduled_trips,
            completed_trips=request.scheduled_trips,
            weighed_volume_m3=request.estimated_volume_m3,
            fuel_standard_liters=std_fuel,
            fuel_actual_liters=actual_fuel,
            fuel_variance_pct=var_pct,
            status=DispatchOrderStatus.DELIVERED,
            notes="Đã đổ thải đúng bãi quy định, có phiếu xác nhận của Trạm cân Đình Vũ.",
        )

    def reconcile_sludge_transport(
        self, billing_period: str = "2026-Q1"
    ) -> SludgeTransportReconciliation:
        """Đối soát tự động dịch vụ vận chuyển bùn nạo vét với Cty Thoát Nước Hải Phòng (0200149705)."""
        trips = 320
        total_vol = Decimal("4640.0000")  # 4,640 m3 bùn
        unit_price = Decimal("145000.0000")
        total_calc = (total_vol * unit_price).quantize(Decimal("0.0001"))
        invoiced_amt = total_calc  # Khớp hoàn toàn 672,800,000 đ
        variance = invoiced_amt - total_calc

        return SludgeTransportReconciliation(
            partner_tax_id="0200149705",
            partner_name="Công ty TNHH Một thành viên Thoát nước Hải Phòng",
            billing_period=billing_period,
            total_trips=trips,
            total_volume_weighed_m3=total_vol,
            unit_price_per_m3=unit_price,
            total_amount_pre_tax=total_calc,
            invoiced_amount=invoiced_amt,
            amount_variance=variance,
            reconciliation_status="MATCHED",
            discrepancy_explanation="Khối lượng bùn nạo vét theo vé cân bãi đổ Đình Vũ khớp 100% với Hóa đơn GTGT cước vận chuyển.",
        )
