"""API Router for Accounting Debt Ledgers (TK 131, 331) and Fixed Assets (TK 211, 214) Source of Truth."""

from __future__ import annotations

from datetime import date
from typing import Any

from fastapi import APIRouter, Depends, HTTPException, Query
from pydantic import BaseModel

from app.models.debt_ledger_schemas import (
    ConsolidatedDebtOverview,
    DebtLedgerResponse,
    FixedAssetResponse,
)
from app.modules.auth.presentation.auth import get_current_user, require_role
from app.modules.financial.application.debt_ledger_sync_service import (
    DebtLedgerSyncService,
)

router = APIRouter(
    prefix="/v1/erp/finance",
    tags=["Sổ Công Nợ & Tài Sản Cố Định (Source of Truth)"],
    dependencies=[Depends(require_role(["superadmin", "director", "accountant"]))],
)

_service = DebtLedgerSyncService()


class SyncFromExcelRequest(BaseModel):
    folder_path: str | None = None


@router.get("/consolidated-overview", response_model=ConsolidatedDebtOverview)
def get_consolidated_overview(
    as_of_date: date | None = Query(
        None, description="Ngày chốt số liệu (mặc định 2026-03-31)"
    ),
) -> ConsolidatedDebtOverview:
    """Lấy báo cáo hợp nhất Công nợ phải thu (131), Phải trả (331) và Tài sản cố định (211/214)."""
    return _service.get_consolidated_overview(as_of_date=as_of_date)


@router.get("/debt-ledger", response_model=DebtLedgerResponse)
def get_debt_ledger(
    account_code: str = Query(
        "131", description="Mã tài khoản công nợ: 131 (Phải thu) hoặc 331 (Phải trả)"
    ),
    as_of_date: date | None = Query(
        None, description="Ngày chốt số liệu (mặc định 2026-03-31)"
    ),
) -> DebtLedgerResponse:
    """Lấy chi tiết sổ công nợ tổng hợp theo tài khoản kế toán (131 hoặc 331)."""
    if account_code not in ("131", "331"):
        raise HTTPException(
            status_code=400,
            detail=f"Tài khoản {account_code} không hợp lệ. Chỉ chấp nhận '131' hoặc '331'.",
        )
    return _service.get_debt_ledger_report(account_code=account_code, as_of_date=as_of_date)


@router.get("/receivables", response_model=DebtLedgerResponse)
def get_receivables_ledger(
    as_of_date: date | None = Query(
        None, description="Ngày chốt số liệu (mặc định 2026-03-31)"
    ),
) -> DebtLedgerResponse:
    """Lấy danh sách 26 khách hàng nợ và tình hình thanh toán TK 131."""
    return _service.get_debt_ledger_report(account_code="131", as_of_date=as_of_date)


@router.get("/payables", response_model=DebtLedgerResponse)
def get_payables_ledger(
    as_of_date: date | None = Query(
        None, description="Ngày chốt số liệu (mặc định 2026-03-31)"
    ),
) -> DebtLedgerResponse:
    """Lấy danh sách 35 nhà cung cấp và thầu phụ nợ TK 331."""
    return _service.get_debt_ledger_report(account_code="331", as_of_date=as_of_date)


@router.get("/fixed-assets", response_model=FixedAssetResponse)
def get_fixed_assets_ledger(
    as_of_date: date | None = Query(
        None, description="Ngày chốt số liệu (mặc định 2026-03-31)"
    ),
) -> FixedAssetResponse:
    """Lấy danh mục 11 máy móc/xe vận tải, nguyên giá và hao mòn lũy kế TK 211, 214."""
    return _service.get_fixed_assets_report(as_of_date=as_of_date)


@router.post("/sync-from-excel")
def trigger_sync_from_excel(
    body: SyncFromExcelRequest | None = None,
    current_user: dict = Depends(require_role(["superadmin", "director", "accountant"])),
) -> dict[str, Any]:
    """Kích hoạt đồng bộ lại dữ liệu từ thư mục file Excel kế toán thực tế."""
    folder = body.folder_path if body and body.folder_path else None
    return _service.sync_all_from_folder(folder_path=folder)
