import asyncio
import io
import json
import sys

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", line_buffering=True)
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8", line_buffering=True)
sys.path.insert(0, r"c:\Projects\DSCons")

from app.core.postgres.erp_client import ErpDatabaseClient
from app.core.settings import get_settings
from app.modules.core.application.document_processing_service import DocumentProcessingService
from app.modules.agents.application.llm_client import LLMClient


async def test_gemini_extraction():
    settings = get_settings()
    print("=== CẤU HÌNH LLM / GEMINI ===")
    print(f"Gemini Enabled: {settings.gemini_enabled}")
    print(f"Gemini Base URL: {settings.gemini_base_url}")
    print(f"Gemini Model: {settings.gemini_model_name}")
    print(
        f"Gemini API Key: {settings.gemini_api_key[:8]}...{settings.gemini_api_key[-6:] if settings.gemini_api_key else ''}"
    )

    # 1. Test basic chat call to Gemini
    llm = LLMClient(settings)
    provider_info = llm.get_provider_for_agent("thao")
    print(
        f"\nProvider for Agent Thảo: {json.dumps(provider_info, ensure_ascii=False, indent=2)}"
    )

    print("\n[1/3] Đang gửi kiểm tra kết nối tới Google Gemini...")
    try:
        test_reply = await llm.chat(
            [
                {
                    "role": "system",
                    "content": "Bạn là chuyên gia thẩm định hồ sơ công trình của DSCons.",
                },
                {
                    "role": "user",
                    "content": "Hãy chào ngắn gọn và xác nhận bạn là Gemini 2.5 Flash sẵn sàng bóc tách hồ sơ.",
                },
            ],
            agent_code="thao",
        )
        print(f"-> Gemini phản hồi thành công:\n{test_reply}\n")
    except Exception as e:
        print(f"-> LỖI KẾT NỐI GEMINI: {e}")
        return

    # 2. Run full Document Pipeline on IB2600471890
    print("[2/3] Đang đọc file gốc của văn bản IB2600471890...")
    erp_client = ErpDatabaseClient()
    doc = erp_client.get_document("0736017b-3f82-42b8-a8bb-d573136ddfb7")
    if not doc:
        print("Không tìm thấy document trong DB!")
        return

    file_path = doc["file_path"]
    file_format = doc["file_format"]
    filename = "Thông báo mời thầu - Gói thầu số 05 Kênh Ông Đèn.pdf"
    print(f"File Path: {file_path}")

    doc_service = DocumentProcessingService(llm_client=llm, erp_client=erp_client)

    print("\n[3/3] Đang chạy Pipeline Đối Soát Kép (Thảo + Thủy) qua Gemini...")
    await doc_service.run_pipeline(
        doc_id=doc["id"],
        file_path_str=file_path,
        filename=filename,
        file_format=file_format,
    )

    # 3. Fetch and print updated document from DB
    updated_doc = erp_client.get_document(doc["id"])
    print("\n=== KẾT QUẢ BÓC TÁCH & ĐỐI SOÁT CỦA GEMINI ===")
    print(f"Số hiệu văn bản    : {updated_doc.get('document_code')}")
    print(f"Trích yếu          : {updated_doc.get('document_title')}")
    print(f"Cơ quan ban hành   : {updated_doc.get('issuer_name')}")
    print(f"Người ký           : {updated_doc.get('signer_name')}")
    print(f"Mã số thuế         : {updated_doc.get('partner_tax_code')}")
    print(f"Ngày ban hành      : {updated_doc.get('issue_date')}")
    print(f"Tình trạng chữ ký  : {updated_doc.get('signature_status')}")
    print(f"Điểm tin cậy OCR   : {updated_doc.get('ocr_confidence_score')}%")
    print(f"Trạng thái cách ly : {updated_doc.get('quarantine_status')}")
    print(f"\nTóm tắt nội dung   :\n{updated_doc.get('summary_content')}")
    print(f"\nNhận xét kiểm toán :\n{updated_doc.get('cross_audit_summary')}")
    print(
        f"\nCờ kiểm toán       :\n{json.dumps(updated_doc.get('ocr_validation_flags'), ensure_ascii=False, indent=2)}"
    )
    print(
        f"\nCăn cứ pháp lý     :\n{json.dumps(updated_doc.get('ai_legal_references'), ensure_ascii=False, indent=2)}"
    )


if __name__ == "__main__":
    asyncio.run(test_gemini_extraction())
