"""Integration tests for Equipment Fleet and Fuel Consumption Engine.
Strict Zero-Tolerance Synthetic Data & Decimal(18,4) COMPLIANT.
"""

from __future__ import annotations

import pytest
from fastapi.testclient import TestClient

from app.main import create_app
from app.modules.auth.application.auth_service import AuthService
from app.modules.operations.application.equipment_efficiency_service import (
    EquipmentEfficiencyService,
)


@pytest.fixture
def client() -> TestClient:
    app = create_app()
    return TestClient(app)


@pytest.fixture
def auth_token() -> str:
    auth = AuthService()
    return auth.create_jwt_token(
        {
            "id": "admin-id",
            "email": "director@dscons.vn",
            "role": "superadmin",
            "full_name": "Nguyễn Sĩ Sơn",
            "company_id": "0753d827-90e1-4894-9c16-266ca572c5eb",
        }
    )


@pytest.fixture
def auth_headers(auth_token: str) -> dict[str, str]:
    return {"Authorization": f"Bearer {auth_token}"}


def test_fleet_fuel_summary_service():
    """Kiểm tra báo cáo tổng hợp đoàn xe máy và tiêu hao dầu DO từ nguồn hóa đơn Cục Thuế."""
    service = EquipmentEfficiencyService()
    res = service.get_fleet_fuel_summary()

    assert "summary" in res
    s = res["summary"]
    assert s["total_equipment"] >= 40
    assert s["total_trucks"] >= 15
    assert s["total_excavators"] >= 10
    assert s["total_fuel_liters"] > 50000
    assert s["total_fuel_cost_vnd"] > 1000000000
    assert s["total_fills_count"] >= 100

    # Kiểm tra danh sách xe trong đoàn
    fleet = res["fleet_equipment"]
    assert len(fleet) >= 20

    # Kiểm tra tồn tại đoàn 7 xe ben Howo chính của Định Sơn
    plates = [e.get("license_plate") for e in fleet if e.get("license_plate")]
    assert "15H-288.44" in plates
    assert "34H-048.48" in plates
    assert "15H-131.26" in plates
    assert "15H-283.52" in plates
    assert "15H-105.29" in plates
    assert "15H-105.76" in plates
    assert "15H-106.24" in plates


def test_equipment_fuel_efficiency_detail():
    """Kiểm tra bóc tách chi tiết hiệu suất tiêu hao dầu cho xe ben Howo 34H-048.48."""
    service = EquipmentEfficiencyService()
    # Tìm ID của xe 34H-048.48 (EQ-TRUTH-TRU-027)
    with service.repo.get_connection() as conn, conn.cursor() as cur:
        cur.execute("SELECT id FROM erp_equipment WHERE equipment_code = 'EQ-TRUTH-TRU-027';")
        row = cur.fetchone()
        assert row is not None
        truck_id = str(row["id"])

    detail = service.get_equipment_efficiency(truck_id)
    assert detail["equipment_code"] == "EQ-TRUTH-TRU-027"
    assert detail["license_plate"] == "34H-048.48"
    assert detail["fuel_norm_per_hour"] == 22.0
    assert detail["total_fuel_liters"] > 10000
    assert detail["total_fuel_cost_vnd"] > 200000000
    assert len(detail["fuel_logs"]) > 10
    assert detail["average_consumption_liters_per_hour"] > 0
    assert detail["efficiency_percentage"] > 0


def test_fleet_fuel_summary_api_protected(
    client: TestClient, auth_headers: dict[str, str]
):
    """Kiểm tra API endpoint /v1/erp/advanced/equipment/fleet-summary có bảo vệ JWT."""
    # 1. Unauthenticated request -> 401
    unauth_resp = client.get("/v1/erp/advanced/equipment/fleet-summary")
    assert unauth_resp.status_code == 401

    # 2. Authenticated request -> 200
    auth_resp = client.get("/v1/erp/advanced/equipment/fleet-summary", headers=auth_headers)
    assert auth_resp.status_code == 200
    data = auth_resp.json()
    assert "summary" in data
    assert "fleet_equipment" in data
    assert data["summary"]["total_fuel_liters"] > 50000


def test_excavator_fuel_efficiency_detail():
    """Kiểm tra chi tiết hiệu suất tiêu hao máy xúc Komatsu PC200-8."""
    service = EquipmentEfficiencyService()
    with service.repo.get_connection() as conn, conn.cursor() as cur:
        cur.execute("SELECT id FROM erp_equipment WHERE equipment_code = 'EQ-TRUTH-EXC-012';")
        row = cur.fetchone()
        assert row is not None
        exc_id = str(row["id"])

    detail = service.get_equipment_efficiency(exc_id)
    assert detail["equipment_code"] == "EQ-TRUTH-EXC-012"
    assert detail["fuel_norm_per_hour"] == 16.5
    assert detail["total_fuel_liters"] > 5000
    assert len(detail["fuel_logs"]) >= 10
