from __future__ import annotations

import logging
from typing import Any

from fastapi import APIRouter, Depends, HTTPException, Query

from app.modules.auth.presentation.auth import require_role
from app.modules.invoices.application.invoice_processing_service import InvoiceProcessingService

logger = logging.getLogger("dscons.api.invoices")
router = APIRouter(
    prefix="/v1/erp/invoices",
    tags=["E-Invoices & Tax Management"],
    dependencies=[
        Depends(require_role(["superadmin", "director", "accountant", "pm"]))
    ],
)
invoice_router = router
invoice_service = InvoiceProcessingService()


@invoice_router.get("", summary="Lấy danh sách Hóa Đơn Điện Tử")
async def list_invoices(
    direction: str | None = Query(
        None, description="Loại HĐ: input (Mua vào) hoặc output (Bán ra)"
    ),
    status: str | None = Query(
        None, description="Trạng thái: valid, cancelled, replaced"
    ),
    reconciliation_status: str | None = Query(
        None, description="Trạng thái đối soát: unreconciled, manual_approved"
    ),
    project_id: str | None = Query(None, description="Lọc theo ID dự án"),
    search: str | None = Query(
        None, description="Từ khóa: Số HĐ, MST, Tên bên mua/bán, Tên dự án"
    ),
    from_date: str | None = Query(None, description="Từ ngày (YYYY-MM-DD)"),
    to_date: str | None = Query(None, description="Đến ngày (YYYY-MM-DD)"),
    vat_rate: str | None = Query(None, description="Thuế suất VAT: 0, 5, 8, 10, kct"),
    min_amount: float | None = Query(None, description="Số tiền tối thiểu (VNĐ)"),
    max_amount: float | None = Query(None, description="Số tiền tối đa (VNĐ)"),
    signature_valid: bool | None = Query(
        None, description="Trạng thái chữ ký số: true, false"
    ),
    invoice_series: str | None = Query(
        None, description="Ký hiệu mẫu số hóa đơn (VD: 1C26T...)"
    ),
    invoice_type_filter: str | None = Query(
        None,
        description="Lọc loại HĐ: cash_register (Máy tính tiền MTT), standard (HĐ GTGT thông thường)",
    ),
    category: str | None = Query(
        None,
        description="Phân loại hàng hóa: machinery (Xe máy/thiết bị), materials (Vật tư), fuel (Xăng dầu), services (Dịch vụ/thuê ca)",
    ),
    sort_by: str = Query(
        "issue_date",
        description="Trường sắp xếp: issue_date, total_amount_vnd, subtotal_amount_vnd, vat_amount_vnd, invoice_number, seller_name, buyer_name",
    ),
    sort_order: str = Query(
        "DESC", description="Thứ tự sắp xếp: ASC (bé->lớn), DESC (lớn->bé)"
    ),
    limit: int = Query(50, ge=1, le=200),
    offset: int = Query(0, ge=0),
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "accountant", "pm"])
    ),
) -> dict[str, Any]:
    """Danh sách hóa đơn đầu vào và đầu ra kèm bộ lọc chi tiết chuẩn meInvoice, sắp xếp và phân trang."""
    invoices, total_count = invoice_service.list_invoices(
        direction=direction,
        status=status,
        search=search,
        from_date=from_date,
        to_date=to_date,
        reconciliation_status=reconciliation_status,
        project_id=project_id,
        vat_rate=vat_rate,
        min_amount=min_amount,
        max_amount=max_amount,
        signature_valid=signature_valid,
        invoice_series=invoice_series,
        category=category,
        sort_by=sort_by,
        sort_order=sort_order,
        invoice_type_filter=invoice_type_filter,
        limit=limit,
        offset=offset,
    )
    return {
        "status": "success",
        "total": total_count,
        "limit": limit,
        "offset": offset,
        "category": category,
        "sort_by": sort_by,
        "sort_order": sort_order,
        "invoices": invoices,
    }


@invoice_router.get(
    "/summary/kpis", summary="Tổng hợp chỉ số tài chính & VAT từ Sổ Hóa Đơn"
)
async def get_invoice_kpis(
    from_date: str | None = Query(None, description="Từ ngày (YYYY-MM-DD)"),
    to_date: str | None = Query(None, description="Đến ngày (YYYY-MM-DD)"),
    project_id: str | None = Query(None, description="Lọc theo ID dự án"),
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "accountant", "pm"])
    ),
) -> dict[str, Any]:
    """Tổng hợp tiền hàng, thuế GTGT đầu vào/đầu ra và số hóa đơn cần đối soát (hỗ trợ lọc kỳ)."""
    kpis = invoice_service.get_invoice_summary_kpis(
        from_date=from_date, to_date=to_date, project_id=project_id
    )
    return {"status": "success", "kpis": kpis}


@invoice_router.get(
    "/categories/summary",
    summary="Thống kê phân loại hóa đơn (Xe máy, vật tư, xăng dầu, dịch vụ)",
)
async def get_invoice_categories_summary(
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "accountant", "pm"])
    ),
) -> dict[str, Any]:
    """Thống kê số lượng và tổng tiền hóa đơn theo danh mục và tài sản thiết bị sở hữu."""
    summary = invoice_service.get_invoice_categories_summary()
    return {"status": "success", "categories": summary}


@invoice_router.get("/{invoice_id}", summary="Lấy chi tiết 1 Hóa Đơn Điện Tử")
async def get_invoice_detail(
    invoice_id: str,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "accountant", "pm"])
    ),
) -> dict[str, Any]:
    """Chi tiết hóa đơn kèm từng dòng hàng hóa và lịch sử audit truy vết."""
    inv = invoice_service.get_invoice_detail(invoice_id)
    if not inv:
        raise HTTPException(
            status_code=404, detail="Không tìm thấy hóa đơn điện tử yêu cầu."
        )
    return {"status": "success", "invoice": inv}


@invoice_router.get(
    "/analytics/cost-breakdown",
    summary="Phân tích phân rã chi phí vật tư chính, ca máy, thầu phụ",
)
async def get_cost_breakdown(
    project_id: str | None = Query(None, description="Lọc theo ID dự án"),
    from_date: str | None = Query(None, description="Từ ngày (YYYY-MM-DD)"),
    to_date: str | None = Query(None, description="Đến ngày (YYYY-MM-DD)"),
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "accountant", "pm"])
    ),
) -> dict[str, Any]:
    """Phân tích cơ cấu chi phí vật tư chính (Thép, Bê tông, Xi măng...) vs Ca máy vs Thầu phụ và đơn giá bình quân."""
    res = invoice_service.get_material_and_cost_analytics(
        project_id=project_id, from_date=from_date, to_date=to_date
    )
    return {"status": "success", "analytics": res}


from pydantic import BaseModel
class MatchProjectPayload(BaseModel):
    project_id: str
    wbs_id: str | None = None

@invoice_router.post(
    "/{invoice_id}/match-project",
    summary="Gán hóa đơn vào Dự án / WBS (Trigger Pub/Sub)",
)
async def match_invoice_project(
    invoice_id: str,
    payload: MatchProjectPayload,
    current_user: dict[str, Any] = Depends(
        require_role(["superadmin", "director", "accountant", "pm"])
    ),
) -> dict[str, Any]:
    """Liên kết hóa đơn với dự án và sinh sự kiện Outbox cho module Projects (Idempotent)."""
    res = invoice_service.match_invoice_to_project(
        invoice_id=invoice_id,
        project_id=payload.project_id,
        wbs_id=payload.wbs_id
    )
    return res
