"""Excel 发货清单生成器（openpyxl）

build_dispatch_excel: 接受包裹数据列表，返回 xlsx 字节流
"""
import io
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side


_HEADERS = [
    "快递公司", "快递单号", "收件人名称", "收件人电话",
    "收件人地址", "发件人名称", "商品详情", "商品数量", "重量", "身份证号码",
]

_HEADER_FILL = PatternFill("solid", fgColor="4F46E5")
_HEADER_FONT = Font(bold=True, color="FFFFFF", size=11)
_THIN = Side(style="thin", color="D1D5DB")
_BORDER = Border(left=_THIN, right=_THIN, top=_THIN, bottom=_THIN)

_COL_WIDTHS = [12, 20, 12, 16, 40, 12, 50, 10, 8, 20]


def build_dispatch_excel(parcels_data: list[dict], batch_no: str) -> bytes:
    """
    parcels_data 每项字段：
        carrier_name, tracking_no, recipient_name, recipient_phone,
        recipient_address, sender_name, goods_detail, goods_qty,
        weight, id_card
    返回 xlsx 字节流。
    """
    wb = Workbook()
    ws = wb.active
    ws.title = f"发货清单_{batch_no}"

    # 写表头
    for col_idx, header in enumerate(_HEADERS, start=1):
        cell = ws.cell(row=1, column=col_idx, value=header)
        cell.font = _HEADER_FONT
        cell.fill = _HEADER_FILL
        cell.alignment = Alignment(horizontal="center", vertical="center")
        cell.border = _BORDER

    # 写数据行
    for row_idx, parcel in enumerate(parcels_data, start=2):
        row_values = [
            parcel.get("carrier_name", ""),
            parcel.get("tracking_no", ""),
            parcel.get("recipient_name", ""),
            parcel.get("recipient_phone", ""),
            parcel.get("recipient_address", ""),
            parcel.get("sender_name", ""),
            parcel.get("goods_detail", ""),
            parcel.get("goods_qty", 0),
            parcel.get("weight", 0),
            parcel.get("id_card", ""),
        ]
        for col_idx, value in enumerate(row_values, start=1):
            cell = ws.cell(row=row_idx, column=col_idx, value=value)
            cell.alignment = Alignment(vertical="center", wrap_text=True)
            cell.border = _BORDER

    # 设置列宽
    for col_idx, width in enumerate(_COL_WIDTHS, start=1):
        ws.column_dimensions[ws.cell(row=1, column=col_idx).column_letter].width = width

    ws.row_dimensions[1].height = 20

    buf = io.BytesIO()
    wb.save(buf)
    return buf.getvalue()
