from pathlib import Path

from docx import Document
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT, WD_TABLE_ALIGNMENT
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.style import WD_STYLE_TYPE
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.shared import Inches, Pt, RGBColor


ROOT = Path(__file__).resolve().parent
INPUT = ROOT / "manual-working.docx"
OUTPUT = ROOT / "manual.docx"


def set_run_font(run, size=10.5, bold=False, color="000000"):
    run.font.name = "PingFang SC"
    run._element.get_or_add_rPr().rFonts.set(qn("w:eastAsia"), "PingFang SC")
    run.font.size = Pt(size)
    run.font.bold = bold
    run.font.color.rgb = RGBColor.from_string(color)


def shade(cell, fill):
    tc_pr = cell._tc.get_or_add_tcPr()
    shd = OxmlElement("w:shd")
    shd.set(qn("w:fill"), fill)
    tc_pr.append(shd)


def set_cell_text(cell, text, bold=False, color="000000", align=WD_ALIGN_PARAGRAPH.LEFT):
    cell.text = ""
    paragraph = cell.paragraphs[0]
    paragraph.alignment = align
    run = paragraph.add_run(text)
    set_run_font(run, 9.5, bold, color)
    cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER


doc = Document(str(INPUT))
styles = doc.styles
for section in doc.sections:
    for drawing_property in section.header._element.xpath('.//wp:docPr'):
        drawing_property.set('descr', '康比特品牌标识')
        drawing_property.set('title', '康比特品牌标识')

title_style = styles["Title"] if "Title" in [style.name for style in styles] else styles.add_style("Title", WD_STYLE_TYPE.PARAGRAPH)
title_style.font.name = "PingFang SC"
title_style._element.rPr.rFonts.set(qn("w:eastAsia"), "PingFang SC")
title_style.font.size = Pt(22)
title_style.font.bold = True
title_style.font.color.rgb = RGBColor(0, 0, 0)

for style_name, size in [("Heading 1", 15), ("Heading 2", 12.5), ("Normal", 10.5)]:
    style = styles[style_name]
    style.font.name = "PingFang SC"
    style._element.rPr.rFonts.set(qn("w:eastAsia"), "PingFang SC")
    style.font.size = Pt(size)
    style.font.color.rgb = RGBColor(0, 0, 0)

title = doc.add_paragraph(style="Title")
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
title.add_run("安庆支队智慧食堂大屏使用说明")

intro = doc.add_paragraph()
intro.paragraph_format.space_after = Pt(8)
run = intro.add_run("本说明用于大屏值守人员确认周菜谱页面是否正确运行。页面为只读展示，不提供菜谱编辑、人员修改或业务审批操作。")
set_run_font(run, 10.5)

doc.add_heading("访问入口", level=1)
p = doc.add_paragraph()
run = p.add_run("http://<大屏主机>:8082/#/anhui?type=<餐厅ID>")
set_run_font(run, 10.5, True, "0B5A78")

doc.add_heading("页面数据说明", level=1)
rows = [
    ("今日就餐人数", "当前 type 餐厅的可见人员数量，不按当日订单统计"),
    ("查看人员名单", "点击后分页展示当前餐厅姓名，每页 80 人"),
    ("当餐菜谱", "按 PC 餐厅早中晚餐时间自动切换；加餐阶段继续展示晚餐"),
    ("本周菜谱", "周一至周日的早餐、午餐、晚餐和加餐"),
    ("加餐", "与 PC 菜谱管理夜宵同源，即餐次 4"),
    ("伙食定量标准", "按图示一类灶标准固定展示 16 项并自动滚动"),
    ("今日寿星 妈妈菜", "展示当天寿星及已维护妈妈菜；无数据时显示空态"),
    ("吃动平衡", "固定健康提示自动循环滚动"),
]
table = doc.add_table(rows=1, cols=2)
table.alignment = WD_TABLE_ALIGNMENT.CENTER
table.autofit = False
table.columns[0].width = Inches(1.65)
table.columns[1].width = Inches(4.55)
headers = table.rows[0].cells
table_header_properties = table.rows[0]._tr.get_or_add_trPr()
table_header_mark = OxmlElement('w:tblHeader')
table_header_mark.set(qn('w:val'), 'true')
table_header_properties.append(table_header_mark)
for index, text in enumerate(("区域", "数据来源或规则")):
    set_cell_text(headers[index], text, True, "FFFFFF", WD_ALIGN_PARAGRAPH.CENTER)
    shade(headers[index], "0B5A78")
for row_index, item in enumerate(rows):
    cells = table.add_row().cells
    set_cell_text(cells[0], item[0], False, "000000", WD_ALIGN_PARAGRAPH.CENTER)
    set_cell_text(cells[1], item[1])
    if row_index % 2:
        shade(cells[0], "EAF5F8")
        shade(cells[1], "EAF5F8")

doc.add_heading("核对步骤", level=1)
steps = [
    "打开大屏入口，确认顶部名称与 PC 端选中餐厅一致，并显示当前日期时间。",
    "确认左上角人数为当前餐厅人员数；点击查看人员名单，检查姓名、分页和关闭。",
    "确认中心显示当前自然周 7 天，当天列以黄色边框标记。",
    "在 PC 菜谱管理维护某日夜宵后，确认中心加餐行和右侧加餐安排同时出现对应菜品。",
    "观察伙食定量标准和底部吃动平衡，确认持续滚动且没有长时间空白。",
    "某餐次未排菜时应显示横线或明确空态；接口异常时应提示稍后自动重试。",
]
for index, text in enumerate(steps, start=1):
    paragraph = doc.add_paragraph()
    set_run_font(paragraph.add_run(f"{index}. {text}"), 10.5)

doc.add_page_break()
doc.add_heading("当前周页面", level=1)
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
current_week_picture = p.add_run().add_picture(str(ROOT / "screenshots/current-week.png"), width=Inches(6.1))
current_week_picture._inline.docPr.set('descr', '安庆支队智慧食堂当前周大屏')
current_week_picture._inline.docPr.set('title', '当前周大屏')
caption = doc.add_paragraph("图 1 当前周智慧食堂大屏")
caption.alignment = WD_ALIGN_PARAGRAPH.CENTER
set_run_font(caption.runs[0], 9, False, "666666")

doc.add_page_break()
doc.add_heading("查看人员名单", level=1)
p = doc.add_paragraph("点击人数卡片下方查看人员名单。弹窗只展示当前餐厅姓名，可通过页码浏览全部人员。下图使用脱敏示例数据。")
set_run_font(p.runs[0], 10.5)
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
staff_list_picture = p.add_run().add_picture(str(ROOT / "screenshots/staff-list-dialog.png"), width=Inches(6.1))
staff_list_picture._inline.docPr.set('descr', '智慧食堂大屏查看人员名单弹窗脱敏示例')
staff_list_picture._inline.docPr.set('title', '查看人员名单')
caption = doc.add_paragraph("图 2 查看人员名单弹窗")
caption.alignment = WD_ALIGN_PARAGRAPH.CENTER
set_run_font(caption.runs[0], 9, False, "666666")

doc.add_page_break()
doc.add_heading("夜宵同步示例", level=1)
p = doc.add_paragraph("本地历史周只读数据验证：PC 夜宵同时进入中心加餐行和右侧加餐卡。")
set_run_font(p.runs[0], 10.5)
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
night_snack_picture = p.add_run().add_picture(str(ROOT / "screenshots/night-snack.png"), width=Inches(6.1))
night_snack_picture._inline.docPr.set('descr', 'PC夜宵同步到大屏加餐安排的验证画面')
night_snack_picture._inline.docPr.set('title', '夜宵同步示例')
caption = doc.add_paragraph("图 3 夜宵同步到加餐安排")
caption.alignment = WD_ALIGN_PARAGRAPH.CENTER
set_run_font(caption.runs[0], 9, False, "666666")

doc.add_heading("已知边界", level=1)
limits = [
    "页面每 120 秒刷新一次；PC 修改夜宵后请等待下一次刷新。",
    "页面按 16:9 等比缩放；非 16:9 显示器可能留黑边，但内容不会被裁切。",
    "大屏只读，不应在此页面维护人员或菜谱。",
    "人员姓名属于内部信息，应只在授权的大屏环境使用；接口不返回手机号、生日、部门或卡号。",
]
for text in limits:
    paragraph = doc.add_paragraph()
    set_run_font(paragraph.add_run(f"• {text}"), 10.5)

p = doc.add_paragraph("最后验证：2026-09-10，本地 Docker PHP 7.3 环境和 Vue 大屏端；1920×1080、1366×768 浏览器检查通过。")
set_run_font(p.runs[0], 9, False, "666666")

doc.save(str(OUTPUT))
