"""Autonomous AI normalization routes for DSCons Construction ERP."""

from __future__ import annotations

import logging
from typing import Any

from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query
from pydantic import BaseModel, Field

from app.modules.auth.presentation.auth import get_current_user, require_role
from app.core.postgres.erp_client import ErpDatabaseClient
from app.modules.agents.application.autonomous_engine_service import get_autonomous_service

logger = logging.getLogger("dscons.autonomous_routes")
router = APIRouter(prefix="/v1/autonomous", tags=["Autonomous AI & Data Self-Healing"])


class RunSessionRequest(BaseModel):
    """Payload to trigger an autonomous session."""

    session_type: str = Field(
        default="manual_trigger",
        description="Loại phiên: manual_trigger | emergency_audit | scheduled_sweep",
    )
    lead_agent_code: str = Field(
        default="minh", description="Mã AI Lead điều phối: minh | tung | quynh | nam"
    )


@router.post("/run-session", summary="Kích hoạt phiên tự trị chuẩn hóa toàn hệ thống")
async def run_autonomous_session(
    background_tasks: BackgroundTasks,
    payload: RunSessionRequest | None = None,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "pm", "site_engineer", "accountant"])
    ),
) -> dict[str, Any]:
    """Kích hoạt phiên tự trị quét sâu 57 bảng cơ sở dữ liệu và tự chuẩn hóa."""
    service = get_autonomous_service()
    req_data = payload or RunSessionRequest()

    # Chạy trực tiếp và trả về kết quả
    try:
        result = await service.run_full_autonomous_sweep(
            session_type=req_data.session_type, lead_agent=req_data.lead_agent_code
        )
        return {
            "status": "success",
            "message": f"Phiên tự trị [{result.get('session_code')}] hoàn tất thành công.",
            "data": result,
        }
    except Exception as exc:
        logger.error("Lỗi khi chạy phiên tự trị: %s", exc)
        raise HTTPException(status_code=500, detail=f"Lỗi phiên tự trị: {exc}")


@router.get("/sessions", summary="Danh sách lịch sử các phiên tự trị")
def list_autonomous_sessions(
    limit: int = Query(default=20, ge=1, le=100),
    current_user: dict[str, Any] = Depends(get_current_user),
    erp_client: ErpDatabaseClient = Depends(lambda: ErpDatabaseClient()),
) -> dict[str, Any]:
    """Lấy danh sách các phiên tự trị đã chạy gần nhất."""
    sessions = erp_client.list_autonomous_sessions(limit=limit)
    return {"status": "success", "total": len(sessions), "data": sessions}


@router.get(
    "/sessions/{session_id}", summary="Xem chi tiết một phiên tự trị và nhật ký Healing"
)
def get_autonomous_session_details(
    session_id: str,
    current_user: dict[str, Any] = Depends(get_current_user),
    erp_client: ErpDatabaseClient = Depends(lambda: ErpDatabaseClient()),
) -> dict[str, Any]:
    """Lấy chi tiết phiên tự trị kèm danh sách các hành động tự chuẩn hóa (Healing Logs)."""
    session = erp_client.get_autonomous_session(session_id)
    if not session:
        raise HTTPException(
            status_code=404, detail=f"Không tìm thấy phiên tự trị {session_id}"
        )

    healing_logs = erp_client.list_autonomous_healing_logs(str(session["id"]))
    return {
        "status": "success",
        "session": session,
        "healing_logs": healing_logs,
        "total_healing_actions": len(healing_logs),
    }


@router.get("/overview", summary="Tổng quan năng lực tự trị và chỉ số DQI")
def get_autonomous_overview(
    current_user: dict[str, Any] = Depends(get_current_user),
    erp_client: ErpDatabaseClient = Depends(lambda: ErpDatabaseClient()),
) -> dict[str, Any]:
    """Thống kê tổng quan năng lực tự trị, tổng số bản ghi đã chuẩn hóa và điểm DQI trung bình."""
    stats = erp_client.get_autonomous_overview()
    return {"status": "success", "overview": stats}


@router.get("/status", summary="Trạng thái bộ lập lịch tự trị (Scheduler Status)")
def get_autonomous_scheduler_status(
    current_user: dict[str, Any] = Depends(get_current_user),
) -> dict[str, Any]:
    """Kiểm tra trạng thái bộ đệm tự trị và lịch quét định kỳ tiếp theo."""
    return {
        "status": "active",
        "mode": "autonomous_nightly_sweep_and_manual_trigger",
        "schedule": "01:00 AM Daily",
        "active_agents": [
            "minh",
            "thuy",
            "tung",
            "quynh",
            "hung",
            "thao",
            "nam",
            "lan",
            "phuc",
        ],
        "target_tables_count": 57,
        "healing_strategies": [
            "Làm sạch trích yếu văn bản (Document Title Sanitization)",
            "Đối soát MST đối tác theo chuẩn Tổng Cục Thuế 10/13 số",
            "Tự động gắn thẻ 4 Trụ Cột Doanh Nghiệp (4 Business Pillars)",
            "Đối soát 3 chiều Hóa đơn - Hợp đồng - PO (3-Way Matching)",
            "Tính toán độ chính xác số học EVM CPI/SPI Decimal(18, 4)",
            "Giám sát định mức tiêu hao nhiên liệu máy đào (Lít/giờ)",
            "Chấm điểm Sẵn sàng Kiểm toán (Audit Readiness Gate)",
        ],
    }
