from __future__ import annotations

import logging
from typing import Any

from fastapi import APIRouter, Depends, HTTPException

from app.modules.auth.presentation.auth import get_current_user, require_role
from app.core.postgres.erp_client import ErpDatabaseClient

from .schemas import UserRoleUpdateRequest

logger = logging.getLogger("dscons.api.erp.projects_users")
router = APIRouter()
erp_client = ErpDatabaseClient()











@router.post("/documents/{doc_id}/initiate-project")
def initiate_project_from_document_endpoint(
    doc_id: str,
    req: dict[str, Any] | None = None,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "pm", "site_engineer"])
    ),
) -> dict[str, Any]:
    """Tự động khởi tạo hoặc liên kết Dự án Đấu Thầu mới từ Văn Bản (TBMT/QĐ/HĐ)."""
    try:
        return erp_client.create_project_from_document(doc_id, custom_payload=req)
    except ValueError as ve:
        raise HTTPException(status_code=404, detail=str(ve))
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))


@router.get("/employees")
def list_employees(
    department: str | None = None,
    current_user: dict[str, Any] = Depends(get_current_user),
) -> list[dict[str, Any]]:
    """Lấy danh sách nhân viên công ty."""
    return erp_client.list_employees(department=department)


@router.get("/users")
def list_users(
    current_user: dict[str, Any] = Depends(require_role(["superadmin", "director"])),
) -> list[dict[str, Any]]:
    """Lấy danh sách toàn bộ người dùng và vai trò phân quyền."""
    return erp_client.list_users()


@router.put("/users/{user_id}/role")
def update_user_role(
    user_id: str,
    req: UserRoleUpdateRequest,
    current_user: dict[str, Any] = Depends(require_role(["superadmin"])),
) -> dict[str, Any]:
    """Cập nhật vai trò phân quyền cho tài khoản."""
    try:
        return erp_client.update_user_role(user_id=user_id, new_role=req.role)
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))
