from __future__ import annotations

import logging
from datetime import date
from typing import Any

from fastapi import APIRouter, Depends, HTTPException, Query

from app.modules.auth.presentation.auth import get_current_user, require_role
from app.core.postgres.erp_client import ErpDatabaseClient

from .schemas import (
    EquipmentCreateRequest,
    EquipmentLogCreateRequest,
    FinancialTransactionCreateRequest,
    TimesheetRecordRequest,
)

logger = logging.getLogger("dscons.api.erp.equipment_finance")
router = APIRouter()
erp_client = ErpDatabaseClient()


@router.get("/equipment")
def list_equipment(
    project_id: str | None = None,
    status: str | None = None,
    current_user: dict[str, Any] = Depends(get_current_user),
) -> list[dict[str, Any]]:
    """Tra cứu danh sách máy móc, thiết bị thi công toàn công ty."""
    return erp_client.list_equipment(project_id=project_id, status=status)


@router.post("/equipment")
def create_equipment(
    req: EquipmentCreateRequest,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "pm", "mechanic"])
    ),
) -> dict[str, Any]:
    """Khai báo thiết bị máy móc mới."""
    try:
        return erp_client.create_equipment(req.model_dump())
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))


@router.post("/equipment/logs")
def add_equipment_log(
    req: EquipmentLogCreateRequest,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "pm", "mechanic"])
    ),
) -> dict[str, Any]:
    """Ghi nhận nhật ký hoạt động ca máy và tiêu hao nhiên liệu."""
    try:
        return erp_client.add_equipment_log(req.model_dump())
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))


@router.get("/finance/transactions")
def list_financial_transactions(
    project_id: str | None = None,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "accountant", "pm"])
    ),
) -> list[dict[str, Any]]:
    """Tra cứu dòng tiền thu/chi theo từng dự án."""
    return erp_client.list_financial_transactions(project_id=project_id)


@router.post("/finance/transactions")
def create_financial_transaction(
    req: FinancialTransactionCreateRequest,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "accountant"])
    ),
) -> dict[str, Any]:
    """Tạo giao dịch dòng tiền tạm ứng / thanh toán."""
    try:
        return erp_client.create_financial_transaction(req.model_dump())
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))


@router.get("/finance/bank-transactions")
def list_bank_transactions(
    bank_name: str | None = None,
    account_number: str | None = None,
    project_id: str | None = None,
    category: str | None = None,
    limit: int = 100,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "accountant"])
    ),
) -> list[dict[str, Any]]:
    """Tra cứu chi tiết 943 giao dịch sao kê ngân hàng thực tế của Định Sơn."""
    return erp_client.list_bank_transactions(
        bank_name=bank_name,
        account_number=account_number,
        project_id=project_id,
        category=category,
        limit=limit,
    )


@router.get("/finance/bank-summary")
def get_bank_summary(
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "accountant"])
    ),
) -> dict[str, Any]:
    """Báo cáo tổng hợp số dư và đối soát 4 tài khoản ngân hàng của Định Sơn."""
    return erp_client.get_bank_reconciliation_summary()


@router.get("/hr/timesheets")
def list_timesheets(
    project_id: str | None = None,
    work_date: date | None = None,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "pm", "site_engineer", "accountant"])
    ),
) -> list[dict[str, Any]]:
    """Lấy bảng chấm công nhân sự theo ngày và công trình."""
    return erp_client.list_timesheets(project_id=project_id, work_date=work_date)


@router.post("/hr/timesheets")
def record_timesheet(
    req: TimesheetRecordRequest,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "pm", "site_engineer"])
    ),
) -> dict[str, Any]:
    """Chấm công nhân lực theo ca."""
    try:
        return erp_client.record_timesheet(req.model_dump())
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))


@router.get("/system-activities")
def list_system_activities_endpoint(
    limit: int = Query(default=10, ge=1, le=50),
    current_user: dict[str, Any] = Depends(get_current_user),
) -> list[dict[str, Any]]:
    """Truy xuất danh sách nhật ký hoạt động và kiểm toán thực tế từ hệ thống."""
    return erp_client.list_system_activities(limit=limit)


@router.get("/kpi-summary")
def get_kpi_summary_endpoint(
    current_user: dict[str, Any] = Depends(get_current_user),
) -> dict[str, Any]:
    """Tổng hợp toàn bộ chỉ số KPI vận hành, công trình, thiết bị và hóa đơn thực tế."""
    return erp_client.get_kpi_summary()
