from fastapi import APIRouter, Depends, HTTPException
from uuid import UUID
from pydantic import BaseModel
from datetime import datetime

from app.core.postgres.base_pkg.base_client import BasePostgresClient
from app.modules.projects.application.commands import CreateProjectCommand, CreateProjectCommandHandler
from app.modules.projects.application.queries import GetProjectDetailsQuery, GetProjectDetailsQueryHandler

router = APIRouter(prefix="/v1/erp/projects", tags=["Projects"])

def get_db_client() -> BasePostgresClient:
    return BasePostgresClient()

class CreateProjectRequest(BaseModel):
    name: str
    project_code: str
    start_date: datetime
    description: str | None = None

@router.post("", status_code=201, operation_id="create_project_cqrs")
def create_project(request: CreateProjectRequest, db_client: BasePostgresClient = Depends(get_db_client)):
    """Tạo mới một dự án ERP."""
    command = CreateProjectCommand(
        name=request.name,
        project_code=request.project_code,
        start_date=request.start_date,
        description=request.description
    )
    handler = CreateProjectCommandHandler(db_client)
    try:
        # Xử lý Command qua Handler (Domain Logic + Database Transaction + Outbox Event)
        project_id = handler.handle(command)
        return {"project_id": project_id, "status": "success"}
    except ValueError as e:
        # Lỗi Business Logic từ Domain Entity
        raise HTTPException(status_code=400, detail=str(e))
    except Exception as e:
        # Lỗi hệ thống hoặc Database
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/audit/integrity")
def audit_data_integrity():
    """Kiểm toán tự động tính toàn vẹn và phát hiện sai lệch số liệu/lệch dòng."""
    from app.modules.projects.application.data_integrity_service import DataIntegrityService
    service = DataIntegrityService()
    return service.audit_all_projects_integrity()


@router.post("/sync/excel-to-db")
def sync_excel_to_db(dry_run: bool = True):
    """Đối soát và đồng bộ an toàn từ file Bảng theo dõi công trình.xlsx vào CSDL."""
    from app.modules.projects.application.excel_sync_service import ExcelSyncService
    service = ExcelSyncService()
    return service.sync_excel_to_db(dry_run=dry_run)


@router.post("/sync/db-to-excel")
def sync_db_to_excel():
    """Đồng bộ từ CSDL sang file Excel bảo toàn định dạng và tự động backup."""
    from app.modules.projects.application.excel_sync_service import ExcelSyncService
    service = ExcelSyncService()
    return service.sync_db_to_excel()


@router.get("/{project_id}")
def get_project(project_id: UUID, db_client: BasePostgresClient = Depends(get_db_client)):
    """Lấy thông tin chi tiết dự án (Luồng Đọc tốc độ cao)."""
    query = GetProjectDetailsQuery(project_id=project_id)
    handler = GetProjectDetailsQueryHandler(db_client)
    
    result = handler.handle(query)
    if not result:
        raise HTTPException(status_code=404, detail="Dự án không tồn tại.")
        
    return result
