from pathlib import Path

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
from docx.shared import Cm, Pt, RGBColor
from docx.oxml.ns import qn
from PIL import Image


BASE = Path("/Users/hedy/Desktop/软著-智慧食堂消费终端称重结算系统V1.0")
IMG = BASE / "extracted_images"
OUT = BASE / "智慧食堂消费终端称重结算系统V1.0_软著产品材料_带图版.docx"

BODY_FONT = "Songti SC"
HEAD_FONT = "STHeiti"


def set_east_asia_font(style, font_name: str):
    style.font.name = font_name
    style._element.rPr.rFonts.set(qn("w:eastAsia"), font_name)


def set_run_font(run, font_name=BODY_FONT, size=12, bold=False, color=None):
    run.font.name = font_name
    run._element.rPr.rFonts.set(qn("w:eastAsia"), font_name)
    run.font.size = Pt(size)
    run.bold = bold
    if color:
        run.font.color.rgb = RGBColor(*color)


def set_body_format(p, after=8, first_line=True):
    p.alignment = WD_ALIGN_PARAGRAPH.LEFT
    fmt = p.paragraph_format
    fmt.space_before = Pt(0)
    fmt.space_after = Pt(after)
    fmt.line_spacing_rule = WD_LINE_SPACING.MULTIPLE
    fmt.line_spacing = 1.35
    if first_line:
        fmt.first_line_indent = Pt(24)


def configure_doc(doc):
    section = doc.sections[0]
    section.page_width = Cm(21)
    section.page_height = Cm(29.7)
    section.top_margin = Cm(2.1)
    section.bottom_margin = Cm(2.1)
    section.left_margin = Cm(2.5)
    section.right_margin = Cm(2.5)

    normal = doc.styles["Normal"]
    set_east_asia_font(normal, BODY_FONT)
    normal.font.size = Pt(11.5)
    normal.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT
    normal.paragraph_format.line_spacing_rule = WD_LINE_SPACING.MULTIPLE
    normal.paragraph_format.line_spacing = 1.35
    normal.paragraph_format.space_after = Pt(8)

    for name in ("Heading 1", "Heading 2", "Heading 3"):
        style = doc.styles[name]
        set_east_asia_font(style, HEAD_FONT)
        style.font.color.rgb = RGBColor(0, 0, 0)
        style.font.bold = True
    doc.styles["Heading 1"].font.size = Pt(15)
    doc.styles["Heading 2"].font.size = Pt(13.5)
    doc.styles["Heading 3"].font.size = Pt(12.5)


def add_title(doc):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.paragraph_format.space_after = Pt(12)
    r = p.add_run("智慧食堂消费终端称重结算系统V1.0\n软著产品材料")
    set_run_font(r, HEAD_FONT, 18, True)


def add_heading(doc, text, level=1):
    p = doc.add_paragraph()
    p.style = doc.styles[f"Heading {level}"]
    p.alignment = WD_ALIGN_PARAGRAPH.LEFT
    p.paragraph_format.space_before = Pt(8 if level == 1 else 4)
    p.paragraph_format.space_after = Pt(6)
    r = p.add_run(text)
    set_run_font(r, HEAD_FONT, 15 if level == 1 else 13.5, True)


def add_para(doc, text):
    p = doc.add_paragraph()
    set_body_format(p)
    r = p.add_run(text)
    set_run_font(r, BODY_FONT, 11.5)


def add_caption(doc, text):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.paragraph_format.space_before = Pt(2)
    p.paragraph_format.space_after = Pt(8)
    r = p.add_run(text)
    set_run_font(r, BODY_FONT, 10.5, False, (80, 80, 80))


def add_image(doc, path, caption, max_width_cm=15.6, max_height_cm=9.8):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.paragraph_format.space_before = Pt(2)
    p.paragraph_format.space_after = Pt(2)
    with Image.open(path) as im:
        w, h = im.size
    ratio = w / h
    width = max_width_cm
    height = width / ratio
    if height > max_height_cm:
        height = max_height_cm
        width = height * ratio
    p.add_run().add_picture(str(path), width=Cm(width))
    add_caption(doc, caption)


def add_feature(doc, title, description, image_name, caption, page_break=False):
    if page_break:
        doc.add_page_break()
    add_heading(doc, title, 2)
    add_para(doc, description)
    add_image(doc, IMG / image_name, caption)


def main():
    doc = Document()
    configure_doc(doc)
    add_title(doc)

    add_heading(doc, "一、软件概述", 1)
    add_para(
        doc,
        "智慧食堂消费终端称重结算系统V1.0用于食堂档口和餐饮现场的称重售卖结算。系统围绕消费终端的高频操作，将商品选择、称重读数、单价计算、金额核对、支付确认、订单记录和基础参数配置集中在同一软件中完成，适用于按重量销售菜品、汤品、饮品及其他散装食品的业务场景。",
    )
    add_para(
        doc,
        "软件主要面向团餐食堂、企事业单位食堂、学校食堂、园区餐厅和档口称重售卖场景，帮助现场人员减少人工计价和重复录入，提高结算效率，并为订单查询、营业统计和设备维护提供可追溯的数据基础。",
    )

    doc.add_page_break()
    add_heading(doc, "二、主要功能与界面对应说明", 1)
    add_feature(
        doc,
        "1. 首页功能入口",
        "首页为消费终端的主入口，提供称重结算、订单管理和系统设置三个核心模块。操作人员可根据现场业务直接进入称重售卖、订单查询或参数维护页面，减少操作路径。页面顶部展示系统名称、网络状态、日期时间等信息，便于确认终端处于正常运行状态。",
        "image4.png",
        "图1 首页：展示称重结算、订单管理、系统设置等业务入口。",
    )
    add_feature(
        doc,
        "2. 称重结算",
        "称重结算页面用于完成商品或菜品的现场称重计价。操作人员选择商品后，将商品放置在称重台上，系统读取稳定重量，并按照单价自动计算金额。页面显示当前重量、商品明细、单价、售价和合计金额，支持汤底、饮品等选配项参与金额叠加，核对无误后可进入支付或结算操作。",
        "image5.png",
        "图2 称重结算：根据重量和单价自动计算应收金额，并展示商品明细。",
        page_break=True,
    )
    add_feature(
        doc,
        "3. 手动金额输入与补录",
        "手动金额输入功能用于处理固定金额、临时调整、设备异常或需要人工确认金额的场景。操作人员点击金额输入区域后，系统弹出数字键盘，可录入实际应收金额，并在确认后进入后续支付流程。该功能保证特殊业务也能形成结算记录，避免现场只收款不记账的情况。",
        "image6.png",
        "图3 手动金额输入：通过数字键盘录入实际应收金额。",
        page_break=True,
    )
    add_feature(
        doc,
        "4. 订单管理",
        "订单管理页面用于查看消费终端生成的订单记录和营业概况。系统展示今日营收、订单数、平均客单价等统计信息，并列出订单编号、消费人、消费时间、订单金额、实付金额、支付方式等明细。管理人员可按日期筛选订单，用于营业期间查询、日终核账和异常订单核对。",
        "image7.png",
        "图4 订单管理：展示营业统计和订单流水明细。",
        page_break=True,
    )
    add_feature(
        doc,
        "5. 称重设置",
        "称重设置用于维护称重终端的基础计价参数。页面支持设置商品单价、查看当前皮重，并提供重新去皮和手动清零操作。通过该功能，现场人员可以在开餐前或设备状态变化时完成称量校准，保证重量读取和金额计算符合实际售卖要求。",
        "image8.png",
        "图5 称重设置：维护单价、皮重和清零等称量参数。",
        page_break=True,
    )
    add_feature(
        doc,
        "6. 汤底设置",
        "汤底设置用于维护称重售卖中的附加选项和加价规则。系统可配置汤底名称及对应金额，如麻辣、番茄等选项，在称重结算时与商品金额共同计算。该功能适合麻辣烫、称重小火锅、饮品加料等需要组合计价的档口场景。",
        "image9.png",
        "图6 汤底设置：维护汤底选项和加价金额。",
        page_break=True,
    )
    add_feature(
        doc,
        "7. 商品设置",
        "商品设置用于维护终端可售卖商品的基础资料。页面支持新增商品，并对商品名称、价格等信息进行维护，系统在称重结算时读取对应商品单价作为计价依据。通过商品设置，档口可根据实际售卖品类调整商品清单，保证前台结算数据准确。",
        "image10.png",
        "图7 商品设置：维护可售卖商品名称和价格。",
        page_break=True,
    )
    add_feature(
        doc,
        "8. 支付设置",
        "支付设置用于配置消费终端可使用的支付方式和提示参数。页面支持刷卡支付、刷码支付、人脸支付等方式的启用配置，并可设置支付结果弹框显示时长。通过该功能，系统可根据不同食堂现场的支付环境进行调整，保证结算方式与现场设备、账户体系保持一致。",
        "image11.png",
        "图8 支付设置：配置刷卡、刷码、人脸支付及支付提示时长。",
        page_break=True,
    )

    doc.add_page_break()
    add_heading(doc, "三、软件技术特点", 1)
    add_para(
        doc,
        "系统采用称重数据与商品价格联动的处理方式，将商品选择、重量稳定读取、单价计算和金额确认集中在消费终端完成，减少人工换算步骤。系统支持称重、汤底、商品、支付等参数配置，可适配不同档口的售卖品类和现场设备环境。",
    )
    add_para(
        doc,
        "系统在业务设计上兼顾现场效率和维护便利性。前台页面围绕档口人员的高频操作组织，核心按钮和输入区域集中展示，便于快速完成称重、核对和结算；后台参数以商品、支付和设备运行信息为基础进行维护，减少终端重复配置，适合多档口、多终端的智慧食堂场景使用。",
    )

    doc.save(OUT)
    print(OUT)


if __name__ == "__main__":
    main()
