"""Automated Regression Tests for Treasury Settlement Dossier Engine (Mẫu 03.a/TT & Mẫu 03.c/TT Nghị định 254/2025/NĐ-CP).
Strict Zero-Tolerance Synthetic Data & Regression Gate 100% COMPLIANT.
"""

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.dossier.application.treasury_settlement_service import (
    TreasurySettlementService,
    vi_currency_to_words,
)


@pytest.fixture(scope="module")
def app_client():
    app = create_app()
    return TestClient(app)


@pytest.fixture(scope="module")
def auth_headers():
    auth = AuthService()
    token = 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",
    })
    return {"Authorization": f"Bearer {token}"}


def test_vietnamese_currency_to_words():
    """Kiểm thử hàm chuyển đổi số tiền thành chữ Tiếng Việt chuẩn hành chính."""
    assert "Không đồng" in vi_currency_to_words(0)
    w1 = vi_currency_to_words(1644330000)
    assert "Một tỷ" in w1
    assert "sáu trăm bốn mươi bốn triệu" in w1
    assert "ba trăm ba mươi nghìn đồng chẵn" in w1


def test_treasury_service_dai_thang_form_03a():
    """Kiểm thử tính toán Mẫu 03.a/TT (theo HĐ) chuẩn Nghị định 254/2025/NĐ-CP."""
    service = TreasurySettlementService()
    data = service.get_treasury_data("DA-2608281122", stage_number=1, form_type="03a")

    # 1. Header validation
    assert data["header"]["project_code"] == "DA-2608281122"
    assert "Mẫu số 03.a/TT" in data["header"]["form_code"]
    assert "254/2025/NĐ-CP" in data["header"]["decree_ref"]
    assert "CÔNG TY TNHH XÂY DỰNG ĐỊNH SƠN" in data["header"]["contractor_name"]
    assert data["header"]["contractor_tax_code"] == "0202111150"

    # 2. Financial validation
    assert data["financial_summary"]["contract_value"] == 1644330000.0
    assert data["financial_summary"]["curr_completed_value"] == 822165000.0
    assert data["financial_summary"]["net_payment"] == 657732000.0
    assert "Sáu trăm năm mươi bảy triệu" in data["financial_summary"]["net_payment_in_words"]

    # 3. Items validation
    assert len(data["items"]) == 23


def test_treasury_service_dai_thang_form_03c():
    """Kiểm thử tính toán Mẫu 03.c/TT (phát sinh ngoài HĐ) chuẩn Nghị định 254/2025/NĐ-CP."""
    service = TreasurySettlementService()
    data = service.get_treasury_data("DA-2608281122", stage_number=1, form_type="03c")

    assert data["header"]["form_type"] == "03c"
    assert "Mẫu số 03.c/TT" in data["header"]["form_code"]
    assert "254/2025/NĐ-CP" in data["header"]["decree_ref"]
    assert data["financial_summary"]["curr_completed_value"] > 0
    assert "Phát sinh ngoài HĐ" in data["items"][0]["task_name"]


def test_treasury_excel_generation_03a_and_03c():
    """Kiểm thử xuất file Excel Mẫu 03.a và Mẫu 03.c."""
    service = TreasurySettlementService()
    excel_03a = service.export_treasury_excel("DA-2608281122", stage_number=1, form_type="03a")
    assert isinstance(excel_03a, bytes)
    assert len(excel_03a) > 5000

    excel_03c = service.export_treasury_excel("DA-2608281122", stage_number=1, form_type="03c")
    assert isinstance(excel_03c, bytes)
    assert len(excel_03c) > 5000


def test_treasury_api_preview_and_export(app_client, auth_headers):
    """Kiểm thử các API routes xem trước và xuất Excel Mẫu 03.a / 03.c theo Nghị định 254/2025/NĐ-CP."""
    # 1. Preview HTML Mẫu 03.a
    resp_03a = app_client.get(
        "/v1/erp/dossier/treasury/preview-html?project_code=DA-2608281122&stage_number=1&form_type=03a",
        headers=auth_headers
    )
    assert resp_03a.status_code == 200
    assert "Mẫu số 03.a/TT" in resp_03a.text
    assert "254/2025/NĐ-CP" in resp_03a.text
    assert "ĐỊNH SƠN" in resp_03a.text

    # 2. Preview HTML Mẫu 03.c
    resp_03c = app_client.get(
        "/v1/erp/dossier/treasury/preview-html?project_code=DA-2608281122&stage_number=1&form_type=03c",
        headers=auth_headers
    )
    assert resp_03c.status_code == 200
    assert "Mẫu số 03.c/TT" in resp_03c.text
    assert "254/2025/NĐ-CP" in resp_03c.text

    # 3. Export Excel Mẫu 03.c
    resp_excel = app_client.get(
        "/v1/erp/dossier/treasury/export-excel?project_code=DA-2608281122&stage_number=1&form_type=03c",
        headers=auth_headers
    )
    assert resp_excel.status_code == 200
    assert "spreadsheetml" in resp_excel.headers.get("content-type", "")
    assert len(resp_excel.content) > 5000

    # 4. Compat route test
    resp_compat = app_client.get(
        "/v1/erp/dossier/treasury-02a/preview-html?project_code=DA-2608281122&stage_number=1",
        headers=auth_headers
    )
    assert resp_compat.status_code == 200

    # 5. Not found
    resp_404 = app_client.get(
        "/v1/erp/dossier/treasury/preview-html?project_code=DA-NON-EXISTENT&stage_number=1",
        headers=auth_headers
    )
    assert resp_404.status_code == 404
