from pathlib import Path

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.shared import Inches, Pt


OUT = Path("/Users/hedy/Desktop/软著-智慧食堂消费终端营养结算系统 V1.0/智慧食堂消费终端营养结算系统_操作手册_模板版.docx")
IMG_DIR = Path("/Users/hedy/Desktop/软著-智慧食堂消费终端营养结算系统 V1.0/extracted_images")


def set_run_font(run, size=None, bold=None):
    run.font.name = "宋体"
    run._element.rPr.rFonts.set(qn("w:eastAsia"), "宋体")
    if size is not None:
        run.font.size = Pt(size)
    if bold is not None:
        run.bold = bold


def set_para(paragraph, size=14, bold=False, align=None, first_line=True, before=0, after=10, line=1.6):
    fmt = paragraph.paragraph_format
    fmt.space_before = Pt(before)
    fmt.space_after = Pt(after)
    fmt.line_spacing = line
    if first_line:
        fmt.first_line_indent = Pt(28)
    if align is not None:
        paragraph.alignment = align
    for run in paragraph.runs:
        set_run_font(run, size=size, bold=bold)


def add_title(doc, text, size=22, after=22):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.paragraph_format.space_after = Pt(after)
    r = p.add_run(text)
    set_run_font(r, size=size, bold=True)
    return p


def add_heading(doc, text, level=1):
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(8)
    p.paragraph_format.space_after = Pt(12)
    p.paragraph_format.keep_with_next = True
    r = p.add_run(text)
    set_run_font(r, size=18 if level == 1 else 16, bold=True)
    return p


def add_body(doc, text):
    p = doc.add_paragraph(text)
    set_para(p, size=14, first_line=True, after=8, line=1.65)
    return p


def add_img(doc, image_name, width=6.35):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.paragraph_format.space_before = Pt(6)
    p.paragraph_format.space_after = Pt(18)
    p.paragraph_format.keep_together = True
    r = p.add_run()
    r.add_picture(str(IMG_DIR / image_name), width=Inches(width))
    return p


def set_page(doc):
    section = doc.sections[0]
    section.top_margin = Inches(0.95)
    section.bottom_margin = Inches(0.9)
    section.left_margin = Inches(1.05)
    section.right_margin = Inches(1.05)
    for style_name in ["Normal"]:
        style = doc.styles[style_name]
        style.font.name = "宋体"
        style._element.rPr.rFonts.set(qn("w:eastAsia"), "宋体")
        style.font.size = Pt(14)


def add_footer_page_number(doc):
    section = doc.sections[0]
    footer = section.footer
    p = footer.paragraphs[0]
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run()
    fld_begin = OxmlElement("w:fldChar")
    fld_begin.set(qn("w:fldCharType"), "begin")
    instr = OxmlElement("w:instrText")
    instr.set(qn("xml:space"), "preserve")
    instr.text = "PAGE"
    fld_end = OxmlElement("w:fldChar")
    fld_end.set(qn("w:fldCharType"), "end")
    run._r.append(fld_begin)
    run._r.append(instr)
    run._r.append(fld_end)
    set_run_font(run, size=10)


def main():
    doc = Document()
    set_page(doc)
    add_footer_page_number(doc)

    add_title(doc, "智慧食堂消费终端营养结算系统")
    add_title(doc, "使用说明书", size=20, after=34)

    add_heading(doc, "一、概述")
    add_body(doc, "智慧食堂消费终端营养结算系统V1.0用于食堂档口和餐饮现场的营养化消费结算。系统围绕消费终端的高频收银操作，将定额消费、自定义消费、菜单消费、金额确认、支付方式选择、营养信息展示、订单记录、扫码出餐、余额查询和基础参数配置集中在同一软件中完成，适用于团餐食堂、园区餐厅、学校食堂和企业餐厅等场景。")
    add_body(doc, "软件主要面向档口工作人员、餐厅收银人员、现场实施人员和运维人员使用。现场人员可根据实际业务选择固定金额、临时金额或菜品菜单结算，系统在支付完成后形成订单记录，并展示支付结果、用户余额及本餐营养信息，为现场收银、用户核对、日终对账和营养服务提供数据支撑。")

    add_heading(doc, "二、主要功能与界面对应说明")

    add_heading(doc, "1. 首页功能入口", level=2)
    add_body(doc, "首页为消费终端的主入口，提供定额消费、自定义消费、菜单消费和订单管理等核心模块。操作人员可根据现场结算方式直接进入对应页面，减少收银路径。页面顶部展示系统名称、网络状态、日期时间等信息，右下角保留余额查询入口，便于工作人员快速完成卡片余额核对。")
    add_img(doc, "image2.png")

    add_heading(doc, "2. 基础设置", level=2)
    add_body(doc, "基础设置用于首次部署、设备更换或现场参数调整时完成软件接入配置。页面支持维护API地址、配对码、设备编号、人脸识别激活、菜名播报和语音开关等参数。实施人员完成配置后，消费终端即可与后台服务、支付账户和识别能力保持一致，避免订单归属错误或支付能力不可用。")
    add_img(doc, "image3.png", width=5.8)

    add_heading(doc, "3. 自定义消费", level=2)
    add_body(doc, "自定义消费用于处理非固定价格、临时收款或档口快速结算场景。工作人员进入自定义消费页面后，可点击金额区域录入本次应收金额，系统在页面中放大显示金额，便于收银员和用户共同核对。金额确认后可进入支付环节，形成完整订单记录。")
    add_img(doc, "image4.png")
    add_body(doc, "金额设置完成后，页面展示本次待支付金额。工作人员需在用户确认金额无误后继续支付，避免因临时金额录入错误导致退款或对账差异。")
    add_img(doc, "image5.png")

    add_heading(doc, "4. 定额消费", level=2)
    add_body(doc, "定额消费用于固定金额的快速收银场景，如固定套餐、固定餐补或统一收费档口。工作人员可在页面中录入固定消费金额，也可通过临时金额处理特殊情况。系统确认金额后进入支付流程，适合高峰期快速通行和批量结算。")
    add_img(doc, "image6.png", width=5.9)

    add_heading(doc, "5. 菜单消费", level=2)
    add_body(doc, "菜单消费用于按菜品选择完成营养结算。工作人员在菜品列表中选择菜品分类和营养分类，所选菜品进入购物车，系统自动汇总数量、金额和热量信息。页面右侧展示已选商品、单价、合计金额和本餐热量，核对无误后点击支付进入结算。")
    add_img(doc, "image7.png")

    add_heading(doc, "6. 支付方式选择", level=2)
    add_body(doc, "支付页面用于选择本次订单的支付方式。系统支持刷卡支付、扫码支付和人脸支付，工作人员可根据现场设备和用户需求选择对应方式。选择后系统进入支付确认流程，并在支付完成后生成消费订单。")
    add_img(doc, "image8.png")

    add_heading(doc, "7. 支付成功与营养信息展示", level=2)
    add_body(doc, "用户完成刷卡、扫码或人脸识别支付后，系统展示支付成功结果。页面显示消费人脱敏信息、实付金额、应付金额、账户余额和本餐营养占比，工作人员可据此确认支付成功并完成出餐。营养信息展示用于辅助用户了解本餐摄入结构。")
    add_img(doc, "image9.png")

    add_heading(doc, "8. 订单管理", level=2)
    add_body(doc, "订单管理用于查看当前消费终端产生的订单记录和营业概况。页面顶部展示本日订单笔数和订单总额，列表展示订单编号、消费人、消费时间、订单金额、实付金额和订单来源。管理人员可据此进行现场查询、用户核对和日终对账。")
    add_img(doc, "image10.png")

    add_heading(doc, "9. 扫码出餐", level=2)
    add_body(doc, "扫码出餐用于核验已支付订单并完成出餐确认。工作人员可扫描订单小票二维码，也可手动输入券码。系统识别后显示订单状态，点击确认出餐后生成出餐成功提示，便于避免重复出餐或漏出餐。")
    add_img(doc, "image11.png")
    add_body(doc, "出餐成功后，页面展示订单号和叫号次数。工作人员可根据提示完成餐品交付，并在后续订单核对时追溯出餐状态。")
    add_img(doc, "image12.png")

    add_heading(doc, "10. 余额查询", level=2)
    add_body(doc, "余额查询用于现场查询用户卡片或账户信息。工作人员进入余额查询后，将卡片靠近读卡区域，系统读取卡号、部门、持卡人、现金余额和补贴余额等信息，便于处理用户支付前咨询、余额不足确认和账户核对。")
    add_img(doc, "image13.png")

    doc.core_properties.title = "智慧食堂消费终端营养结算系统使用说明书"
    doc.core_properties.subject = "软件著作权登记操作手册"
    doc.save(OUT)
    print(OUT)


if __name__ == "__main__":
    main()
