"""Unit and Integration tests for Invoice Item Recognition, Equipment Truth Extraction,
and Warehouse Material Staging Engine.
"""

from decimal import Decimal

from fastapi.testclient import TestClient

from app.modules.auth.presentation.auth import get_current_user
from app.main import app
from app.modules.invoices.application.invoice_truth_extraction_service import InvoiceTruthExtractionService

app.dependency_overrides[get_current_user] = lambda: {
    "id": "admin-id",
    "email": "admin@dscons.vn",
    "role": "superadmin",
    "full_name": "Ban Quản Trị Hệ Thống DSCons",
}

client = TestClient(app)
service = InvoiceTruthExtractionService()


def test_classify_owned_equipment():
    """Kiểm tra nhận diện mua sắm máy móc thiết bị sở hữu (ĐVT: Chiếc/Cái/Bộ)."""
    # 1. Máy đào bánh xích Volvo - ĐVT: Chiếc
    res = service.classify_item(
        item_name="Máy đào bánh xích Volvo EC210D mới 100%",
        unit="Chiếc",
        quantity=Decimal("1.0"),
        unit_price=Decimal("2850000000.0"),
        total_amount=Decimal("2850000000.0"),
        seller_name="CÔNG TY CỔ PHẦN THIẾT BỊ NẶNG BÌNH MINH",
    )
    assert res["classification"] == "OWNED_EQUIPMENT"
    assert res["equipment_type"] == "excavator"
    assert "Volvo" in res["brand_model"]
    assert res["ownership_type"] == "owned"

    # 2. Xe Lu Rung Sakai - ĐVT: Cái
    res2 = service.classify_item(
        item_name="Xe Lu Rung Tự Hành Sakai SV512D",
        unit="Cái",
        quantity=Decimal("1.0"),
        unit_price=Decimal("1650000000.0"),
        total_amount=Decimal("1650000000.0"),
        seller_name="CÔNG TY TNHH THƯƠNG MẠI SAKAI VIỆT NAM",
    )
    assert res2["classification"] == "OWNED_EQUIPMENT"
    assert res2["equipment_type"] == "roller"
    assert "Sakai" in res2["brand_model"]


def test_classify_rented_equipment_shift():
    """Kiểm tra nhận diện thuê ca máy / ca xe thi công (ĐVT: Ca/Giờ/Ngày hoặc có chữ thuê)."""
    # 1. Thuê ca máy đào - ĐVT: Ca
    res = service.classify_item(
        item_name="Thuê máy đào Komatsu PC200-8 thi công đắp bờ kênh",
        unit="Ca",
        quantity=Decimal("15.0"),
        unit_price=Decimal("4500000.0"),
        total_amount=Decimal("67500000.0"),
        seller_name="CÔNG TY CỔ PHẦN CƠ GIỚI HẢI PHÒNG",
    )
    assert res["classification"] == "RENTAL_EQUIPMENT"
    assert res["equipment_type"] == "excavator"
    assert res["ownership_type"] == "rented"

    # 2. Ca xe ben tự đổ - ĐVT: Chuyến
    res2 = service.classify_item(
        item_name="Vận chuyển đất đắp bằng xe ben Howo 4 chân",
        unit="Chuyến",
        quantity=Decimal("50.0"),
        unit_price=Decimal("350000.0"),
        total_amount=Decimal("17500000.0"),
        seller_name="HỢP TÁC XÃ VẬN TẢI ĐƯỜNG BỘ",
    )
    assert res2["classification"] == "RENTAL_EQUIPMENT"
    assert res2["equipment_type"] == "truck"
    assert res2["ownership_type"] == "rented"


def test_classify_materials_to_warehouse():
    """Kiểm tra phân loại vật tư xây dựng nhập kho chờ xử lý."""
    # 1. Thép Hòa Phát -> STEEL
    res_steel = service.classify_item(
        item_name="Thép thanh vằn D18 CB400V Hòa Phát",
        unit="Tấn",
        quantity=Decimal("25.5"),
        unit_price=Decimal("15200000.0"),
        total_amount=Decimal("387600000.0"),
        seller_name="CÔNG TY CỔ PHẦN THÉP HÒA PHÁT HẢI DƯƠNG",
    )
    assert res_steel["classification"] == "WAREHOUSE_MATERIAL"
    assert res_steel["material_group"] == "STEEL"

    # 2. Xi măng Chinfon -> CEMENT
    res_cement = service.classify_item(
        item_name="Xi măng poóc lăng hỗn hợp PCB40 Chinfon Hải Phòng",
        unit="Bao",
        quantity=Decimal("500.0"),
        unit_price=Decimal("85000.0"),
        total_amount=Decimal("42500000.0"),
        seller_name="CÔNG TY XI MĂNG CHINFON",
    )
    assert res_cement["classification"] == "WAREHOUSE_MATERIAL"
    assert res_cement["material_group"] == "CEMENT"

    # 3. Dầu Diesel Petrolimex -> FUEL_OIL
    res_fuel = service.classify_item(
        item_name="Dầu Điêzen DO 0.05S-II",
        unit="Lít",
        quantity=Decimal("2400.0"),
        unit_price=Decimal("18500.0"),
        total_amount=Decimal("44400000.0"),
        seller_name="CÔNG TY XĂNG DẦU KHU VỰC III - TNHH MTV",
    )
    assert res_fuel["classification"] == "WAREHOUSE_MATERIAL"
    assert res_fuel["material_group"] == "FUEL_OIL"


def test_extract_and_sync_all_truth_integration():
    """Kiểm tra quy trình trích xuất toàn bộ dữ liệu Truth từ hóa đơn vào PostgreSQL."""
    res = service.extract_and_sync_all_truth(purge_drafts=False)
    assert res["status"] == "success"
    stats = res["stats"]
    assert stats["total_invoices_scanned"] > 0
    assert stats["warehouse_materials_staged"] > 0


def test_api_inventory_truth_endpoints():
    """Kiểm tra các REST API endpoint quản lý kho và tài sản Truth."""
    # 1. Test POST extract
    res_post = client.post(
        "/v1/erp/inventory-truth/extract-from-invoices", json={"purge_drafts": False}
    )
    assert res_post.status_code == 200
    assert res_post.json()["status"] == "success"

    # 2. Test GET warehouse list
    res_wh = client.get("/v1/erp/inventory-truth/warehouse?limit=20")
    assert res_wh.status_code == 200
    wh_data = res_wh.json()
    assert wh_data["status"] == "success"
    assert "items" in wh_data
    assert wh_data["total_count"] >= 0

    # 3. Test GET equipment truth
    res_eq = client.get("/v1/erp/inventory-truth/equipment-truth")
    assert res_eq.status_code == 200
    eq_data = res_eq.json()
    assert eq_data["status"] == "success"
    assert "equipment" in eq_data

    # 4. Test GET summary
    res_sum = client.get("/v1/erp/inventory-truth/summary")
    assert res_sum.status_code == 200
    sum_data = res_sum.json()
    assert sum_data["status"] == "success"
    assert "summary" in sum_data
    assert "total_warehouse_value_vnd" in sum_data["summary"]
