from __future__ import annotations

from typing import Any

from app.common.excel_styler import (
    ALIGN_CENTER,
    ALIGN_LEFT,
    ALIGN_RIGHT,
    BORDER_BOX,
    BORDER_TOTAL,
    FILL_HEADER,
    FILL_TOTAL,
    FMT_CURRENCY_VND,
    FMT_INTEGER,
    FONT_DATA,
    FONT_HEADER,
    FONT_MONO,
    FONT_TITLE,
    FONT_TOTAL,
)

from .boq_rate_breakdown_service import BoqRateBreakdownEngine


def build_rate_breakdown_sheet(
    ws, takeoff: dict[str, Any], items: list[dict[str, Any]]
):
    ws.title = "3. Đơn Giá Chi Tiết (VL+NC+M)"
    ws.views.sheetView[0].showGridLines = True

    # Title
    ws.merge_cells("A2:I2")
    ws["A2"] = "BẢNG PHÂN RÃ ĐƠN GIÁ CHI TIẾT (VẬT LIỆU + NHÂN CÔNG + CA MÁY)"
    ws["A2"].font = FONT_TITLE
    ws["A2"].alignment = ALIGN_CENTER

    headers = [
        ("A4", "STT"),
        ("B4", "Mã WBS"),
        ("C4", "Mã Định Mức"),
        ("D4", "Tên Hạng Mục / Công Tác"),
        ("E4", "ĐVT"),
        ("F4", "Chi Phí Vật Liệu (VL)"),
        ("G4", "Chi Phí Nhân Công (NC)"),
        ("H4", "Chi Phí Máy Thi Công (M)"),
        ("I4", "Đơn Giá Dự Toán (VL+NC+M)"),
    ]
    for cell_ref, text in headers:
        ws[cell_ref] = text
        ws[cell_ref].font = FONT_HEADER
        ws[cell_ref].fill = FILL_HEADER
        ws[cell_ref].alignment = ALIGN_CENTER
        ws[cell_ref].border = BORDER_BOX
    ws.row_dimensions[4].height = 28

    current_row = 5
    for idx, item in enumerate(items, 1):
        u_price = float(item.get("unit_price_vnd") or item.get("unit_price") or 0.0)
        breakdown = BoqRateBreakdownEngine.breakdown_item_rate(
            item_name=item.get("item_name", ""),
            category=item.get("category", ""),
            unit=item.get("unit", "m3"),
            total_unit_price=u_price,
            norm_code=item.get("norm_code", "AF.11110"),
        )

        vl = float(breakdown.get("material_cost_vnd") or 0.0)
        nc = float(breakdown.get("labor_cost_vnd") or 0.0)
        m = float(breakdown.get("equipment_cost_vnd") or 0.0)
        tot = vl + nc + m

        row_data = [
            (f"A{current_row}", idx, FONT_DATA, ALIGN_CENTER, FMT_INTEGER),
            (
                f"B{current_row}",
                item.get("wbs_code") or f"WBS-{idx:02d}",
                FONT_MONO,
                ALIGN_CENTER,
                None,
            ),
            (
                f"C{current_row}",
                item.get("norm_code") or breakdown.get("norm_code", "ĐM-2026"),
                FONT_MONO,
                ALIGN_CENTER,
                None,
            ),
            (
                f"D{current_row}",
                item.get("item_name") or "",
                FONT_DATA,
                ALIGN_LEFT,
                None,
            ),
            (
                f"E{current_row}",
                item.get("unit") or "m3",
                FONT_DATA,
                ALIGN_CENTER,
                None,
            ),
            (f"F{current_row}", vl, FONT_MONO, ALIGN_RIGHT, FMT_CURRENCY_VND),
            (f"G{current_row}", nc, FONT_MONO, ALIGN_RIGHT, FMT_CURRENCY_VND),
            (f"H{current_row}", m, FONT_MONO, ALIGN_RIGHT, FMT_CURRENCY_VND),
            (
                f"I{current_row}",
                f"=F{current_row}+G{current_row}+H{current_row}",
                FONT_TOTAL,
                ALIGN_RIGHT,
                FMT_CURRENCY_VND,
            ),
        ]

        for cell_ref, val, fnt, alg, num_fmt in row_data:
            ws[cell_ref] = val
            ws[cell_ref].font = fnt
            ws[cell_ref].alignment = alg
            ws[cell_ref].border = BORDER_BOX
            if num_fmt:
                ws[cell_ref].number_format = num_fmt

        ws.row_dimensions[current_row].height = 20
        current_row += 1

    # Total Row
    total_row = current_row
    ws.merge_cells(f"A{total_row}:E{total_row}")
    ws[f"A{total_row}"] = "TỔNG CỘNG ĐƠN GIÁ TỔNG HỢP CÁC CÔNG TÁC (VNĐ):"
    ws[f"A{total_row}"].font = FONT_TOTAL
    ws[f"A{total_row}"].alignment = ALIGN_RIGHT
    ws[f"A{total_row}"].fill = FILL_TOTAL

    ws[f"F{total_row}"] = f"=SUM(F5:F{total_row - 1})"
    ws[f"F{total_row}"].font = FONT_TOTAL
    ws[f"F{total_row}"].alignment = ALIGN_RIGHT
    ws[f"F{total_row}"].fill = FILL_TOTAL
    ws[f"F{total_row}"].number_format = FMT_CURRENCY_VND

    ws[f"G{total_row}"] = f"=SUM(G5:G{total_row - 1})"
    ws[f"G{total_row}"].font = FONT_TOTAL
    ws[f"G{total_row}"].alignment = ALIGN_RIGHT
    ws[f"G{total_row}"].fill = FILL_TOTAL
    ws[f"G{total_row}"].number_format = FMT_CURRENCY_VND

    ws[f"H{total_row}"] = f"=SUM(H5:H{total_row - 1})"
    ws[f"H{total_row}"].font = FONT_TOTAL
    ws[f"H{total_row}"].alignment = ALIGN_RIGHT
    ws[f"H{total_row}"].fill = FILL_TOTAL
    ws[f"H{total_row}"].number_format = FMT_CURRENCY_VND

    ws[f"I{total_row}"] = f"=SUM(I5:I{total_row - 1})"
    ws[f"I{total_row}"].font = FONT_TOTAL
    ws[f"I{total_row}"].alignment = ALIGN_RIGHT
    ws[f"I{total_row}"].fill = FILL_TOTAL
    ws[f"I{total_row}"].number_format = FMT_CURRENCY_VND

    for col in ["A", "B", "C", "D", "E", "F", "G", "H", "I"]:
        ws[f"{col}{total_row}"].border = BORDER_TOTAL
    ws.row_dimensions[total_row].height = 24

    widths = {
        "A": 8,
        "B": 10,
        "C": 14,
        "D": 45,
        "E": 8,
        "F": 22,
        "G": 22,
        "H": 22,
        "I": 24,
    }
    for col_letter, width in widths.items():
        ws.column_dimensions[col_letter].width = width
