from __future__ import annotations

import os
import pytest
from decimal import Decimal
from fastapi.testclient import TestClient

from app.main import app
from app.modules.projects.application.data_integrity_service import DataIntegrityService
from app.modules.projects.application.excel_sync_service import ExcelSyncService


client = TestClient(app)


def test_audit_all_projects_integrity_healthy():
    """Kiểm tra dịch vụ kiểm toán dữ liệu dự án trên CSDL thực tế."""
    service = DataIntegrityService()
    result = service.audit_all_projects_integrity()

    assert result["status"] == "healthy"
    assert result["total_projects"] >= 140
    assert result["healthy_projects"] == result["total_projects"]
    assert result["integrity_score_percent"] == 100.0
    assert result["anomaly_count"] == 0
    assert len(result["anomalies"]) == 0


def test_excel_sync_service_dry_run():
    """Kiểm tra dịch vụ đối soát Excel -> DB ở chế độ Dry Run."""
    service = ExcelSyncService()
    result = service.sync_excel_to_db(dry_run=True)

    assert result["dry_run"] is True
    assert result["detected_changes_count"] == 0
    assert len(result["changes"]) == 0


def test_excel_sync_backup_creation():
    """Kiểm tra tính năng sao lưu file Excel trước khi đồng bộ."""
    service = ExcelSyncService()
    backup_path = service.backup_excel_file()

    assert os.path.exists(backup_path)
    assert os.path.getsize(backup_path) > 0
    # Clean up test backup file
    try:
        os.remove(backup_path)
    except Exception:
        pass


def test_api_audit_integrity_endpoint():
    """Kiểm tra API endpoint GET /v1/erp/projects/audit/integrity."""
    response = client.get("/v1/erp/projects/audit/integrity")
    assert response.status_code == 200
    data = response.json()
    assert "status" in data
    assert "total_projects" in data
    assert "integrity_score_percent" in data
    assert data["anomaly_count"] == 0


def test_api_sync_excel_to_db_dry_run_endpoint():
    """Kiểm tra API endpoint POST /v1/erp/projects/sync/excel-to-db."""
    response = client.post("/v1/erp/projects/sync/excel-to-db?dry_run=true")
    assert response.status_code == 200
    data = response.json()
    assert data["dry_run"] is True
    assert data["detected_changes_count"] == 0
