from pathlib import Path

from openpyxl import Workbook, load_workbook
from openpyxl.comments import Comment
from openpyxl.styles import Alignment, Border, Font, PatternFill, Side
from openpyxl.worksheet.page import PageMargins


OUTPUT = Path(__file__).resolve().parents[1] / "康比特智慧食堂前厅软件报价单_20260930.xlsx"
ITEMS = [
    ("基础软件", "基础结算软件", "人员、账户、补贴、消费规则、普通结算、订单、退款、基础对账、权限及基础手机订餐", "套", "待确认", 5000, "已确认", "组织及人数授权范围另定"),
    ("场景扩展", "AI识别结算扩展", "增加AI识别结算场景；需基础结算软件", "套", "待确认", 5000, "已确认", "基础+AI合计10,000元"),
    ("场景扩展", "减重结算扩展", "增加减重结算场景；需基础结算软件", "套", "待确认", 5000, "已确认", "基础+减重合计10,000元；三项组合15,000元"),
    ("功能选配", "营养分析", "菜品营养、菜单分析、个人摄入记录及报告；PC与手机端对应功能一起定义", "套", "待确认", None, "待定", "与基础结算区分"),
    ("功能选配", "健康管理", "健康档案、目标、体重及健康趋势", "套", "待确认", None, "待定", "与营养分析区分"),
    ("功能选配", "AI营养服务", "营养问答、图片记餐等", "套", "待确认", None, "待定", "软件功能费与模型调用费分开"),
    ("功能选配", "电子菜牌", "菜单、图片、价格、营养标签发布", "套", "待确认", None, "待定", "软件授权与屏幕适配分开核定"),
    ("功能选配", "运营数据看板", "就餐、消费、菜品及营养数据展示", "套", "待确认", None, "待定", "标准看板与定制看板区分"),
    ("功能选配", "菜品余量管理", "余量显示、缺菜提醒", "套", "待确认", None, "待定", "需要对应设备数据"),
    ("功能选配", "取餐叫号", "备餐、出餐、待取餐与叫号展示", "套", "待确认", None, "待定", "与基础订单功能区分"),
    ("功能选配", "终端远程排菜", "向设备下发、切换菜品及管理终端", "套", "待确认", None, "待定", "与后台基础菜谱管理区分"),
    ("组织授权", "多食堂管理", "同一单位下的分食堂权限、运营及对账", "授权食堂", "待确认", None, "待定", "包含数量与增购价格待定；档口不直接计为食堂"),
    ("组织授权", "多单位管理", "独立人员、补贴、账务及数据隔离", "管理单位", "待确认", None, "待定", "园区按实际独立管理单位核定"),
    ("组织授权", "总部监管", "跨单位汇总、分级授权及跨单位对账", "套", "待确认", None, "待定", "集团按实际接入范围核定"),
    ("硬件适配", "其他硬件适配", "三种结算场景之外的硬件适配", "类型/型号", "待确认", 1000, "已确认", "同型号多台只收一次；模块含标准接入时先去重"),
    ("部署服务", "云端部署", "云端部署服务", "项目", "部署服务", 0, "已确认", "部署服务不收费；云资源和云服务另核"),
    ("部署服务", "本地化部署", "客户本地环境部署服务", "项目", "部署服务", 5000, "已确认", "服务器等实物硬件另计"),
    ("部署服务", "信创适配部署", "信创环境适配与部署服务", "项目", "部署服务", 20000, "已确认", "已含本地化部署费，不再叠加5,000元"),
    ("资源服务", "云端容量/服务", "云端人数授权、资源及服务套餐", "待确认", "待确认", None, "待定", "人数计量、容量档位、费用及周期待确认"),
    ("资源服务", "短信/AI调用", "短信发送与模型调用资源", "待确认", "按量口径待定", None, "待定", "不计入已确认的软件及部署金额"),
    ("接口服务", "第三方接口/非标开发", "标准接口与定制需求分别评估", "项目", "待确认", None, "待核价", "按接口、需求及联调范围核定"),
    ("交付服务", "现场实施/培训", "现场安装、调试、培训与支持", "项目", "待确认", None, "待核价", "与环境部署区分，重复工作去重"),
    ("售后服务", "维保服务", "质保后的维护支持", "项目", "待确认", None, "待定", "范围、周期及费用另定"),
]


def layout(sheet, widths, end_row, landscape=False):
    edge = Side(style="thin", color="D7DEDD")
    sheet.sheet_view.showGridLines = False
    for row in sheet.iter_rows(min_row=3, max_row=end_row):
        for cell in row:
            cell.font = Font(name="Microsoft YaHei", size=10)
            cell.alignment = Alignment(vertical="center", wrap_text=True)
            cell.border = Border(left=edge, right=edge, top=edge, bottom=edge)
            if isinstance(cell.value, (int, float)) or cell.data_type == "f":
                cell.number_format = '#,##0;(#,##0);"0"'
                cell.alignment = Alignment(horizontal="center", vertical="center")
        sheet.row_dimensions[row[0].row].height = 38
    for column, width in widths.items():
        sheet.column_dimensions[column].width = width
    sheet.freeze_panes = "A4"
    sheet.page_setup.orientation = "landscape" if landscape else "portrait"
    sheet.page_setup.paperSize = sheet.PAPERSIZE_A4
    sheet.page_setup.fitToWidth = 1
    sheet.page_setup.fitToHeight = 0 if landscape else 1
    sheet.sheet_properties.pageSetUpPr.fitToPage = True
    sheet.page_margins = PageMargins(left=0.25, right=0.25, top=0.4, bottom=0.4)
    sheet.print_options.horizontalCentered = True
    sheet.print_area = f"A1:{next(reversed(widths))}{end_row}"


def title(sheet, text, end_column):
    sheet.merge_cells(f"A1:{end_column}1")
    sheet["A1"] = text
    sheet["A1"].font = Font(name="Microsoft YaHei", size=18, bold=True, color="164B43")
    sheet["A1"].alignment = Alignment(horizontal="center", vertical="center")
    sheet.row_dimensions[1].height = 40


def header(sheet, row):
    for cell in sheet[row]:
        cell.fill = PatternFill("solid", fgColor="164B43")
        cell.font = Font(name="Microsoft YaHei", size=10, bold=True, color="FFFFFF")


def main():
    workbook = Workbook()
    details = workbook.active
    details.title = "软件报价"
    details.append([""])
    details.append(["范围：前厅软件及配套服务；币种：人民币元；软件收费周期尚待确认。"])
    details.merge_cells("A2:H2")
    details.append(["分类", "报价项", "包含范围", "计价单位", "收费周期", "单价（元）", "价格状态", "备注"])
    software_items = [item for item in ITEMS if item[0] not in ("部署服务", "交付服务", "售后服务")]
    for item in software_items:
        details.append(item)
    end_items = details.max_row
    package_header = end_items + 2
    for column, value in enumerate(["套餐", "基础结算", "AI识别扩展", "减重扩展", "软件合计"], 1):
        details.cell(package_header, column, value)
    package_rows = []
    for offset, (name, ai, weight) in enumerate([("纯结算版", False, False), ("AI识别版", True, False), ("减重版", False, True), ("全场景适配版", True, True)], 1):
        row = package_header + offset
        package_rows.append(row)
        for column, value in enumerate([name, "=F4", "=F5" if ai else 0, "=F6" if weight else 0, f"=SUM(B{row}:D{row})"], 1):
            details.cell(row, column, value)
    layout(details, {"A": 12, "B": 23, "C": 49, "D": 14, "E": 16, "F": 14, "G": 12, "H": 45}, details.max_row, True)
    title(details, "康比特智慧食堂前厅软件功能价格表", "H")
    header(details, 3)
    header(details, package_header)
    details.auto_filter.ref = f"A3:H{end_items}"
    details.print_title_rows = "1:3"
    for row in range(4, end_items + 1):
        cell = details.cell(row, 6)
        if cell.value is None:
            cell.fill = PatternFill("solid", fgColor="FFF2CC")
        else:
            cell.font = Font(name="Microsoft YaHei", size=10, color="0000FF")
            cell.comment = Comment("来源：用户确认，2026-09-30；扩展单价按已认可套餐差额拆分。", "康比特")

    packages = workbook.create_sheet("部署与服务")
    packages.append([""])
    packages.append(["单位：人民币元；部署方式择一；软件费用见软件报价页。"])
    packages.merge_cells("A2:E2")
    packages.append(["项目", "费用（元）", "状态", "计费口径", "包含范围/备注"])
    for item in ITEMS:
        if item[0] in ("部署服务", "交付服务", "售后服务"):
            packages.append([item[1], item[5], item[6], item[4], item[7]])
    for column, value in enumerate(["套餐＋部署", "云端部署", "本地化部署", "信创适配部署", "费用口径"], 1):
        packages.cell(10, column, value)
    for row, source in zip(range(11, 15), package_rows):
        for column, value in enumerate([f"='软件报价'!A{source}", f"='软件报价'!E{source}+$B$4", f"='软件报价'!E{source}+$B$5", f"='软件报价'!E{source}+$B$6", "仅含软件套餐及部署费用"], 1):
            packages.cell(row, column, value)
    notes = [
        "信创适配部署20,000元已包含本地化部署5,000元，两项不叠加。",
        "云端部署服务免费；云资源、容量套餐、运维费用尚待核定。",
        "功能选配、组织授权、其他硬件适配、接口、实施及维保费用另计；实物硬件不包含。",
        "其他硬件适配1,000元/类型或型号，同型号多台只收一次；全场景仅含普通结算、AI识别、减重。",
        "软件是一次性收费还是年度收费、授权单位/食堂/人数范围，仍待确认。",
    ]
    for row, note in enumerate(notes, 16):
        packages.cell(row, 1, note)
        packages.merge_cells(start_row=row, start_column=1, end_row=row, end_column=5)
    layout(packages, {"A": 24, "B": 17, "C": 17, "D": 18, "E": 32}, packages.max_row)
    title(packages, "康比特智慧食堂前厅软件套餐与部署费用", "E")
    header(packages, 3)
    header(packages, 10)
    for row in (7, 8):
        packages.cell(row, 2).fill = PatternFill("solid", fgColor="FFF2CC")
    for row in range(11, 15):
        for cell in packages[row]:
            if cell.data_type == "f":
                cell.font = Font(name="Microsoft YaHei", size=10, color="008000")
    workbook.save(OUTPUT)
    check = load_workbook(OUTPUT)
    assert check.sheetnames == ["软件报价", "部署与服务"]
    assert [check.worksheets[0][f"F{r}"].value for r in (4, 5, 6, 18)] == [5000, 5000, 5000, 1000]
    assert [check.worksheets[1][f"B{r}"].value for r in (4, 5, 6)] == [0, 5000, 20000]
    print(OUTPUT)


if __name__ == "__main__":
    main()
