from pathlib import Path

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


ROOT = Path(__file__).resolve().parent
SOURCE = ROOT / "manual-working.docx"
OUTPUT = ROOT / "智慧食堂销售报价5步上手.docx"
SHOTS = ROOT / "screenshots"
GREEN = "176B55"
LIGHT = "E8F4EF"
WARN = "FFF4D9"


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=None):
    cell.text = ""
    run = cell.paragraphs[0].add_run(text)
    run.bold = bold
    run.font.name = "Microsoft YaHei"
    run._element.rPr.rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
    run.font.size = Pt(10)
    if color:
        run.font.color.rgb = RGBColor.from_string(color)
    cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER


def add_heading(doc, text, level=1):
    p = doc.add_heading(text, level=level)
    for run in p.runs:
        run.font.name = "Microsoft YaHei"
        run._element.rPr.rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
        run.font.color.rgb = RGBColor.from_string(GREEN)
    return p


def add_body(doc, text, bold=False):
    p = doc.add_paragraph()
    run = p.add_run(text)
    run.bold = bold
    run.font.name = "Microsoft YaHei"
    run._element.rPr.rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
    run.font.size = Pt(11)
    p.paragraph_format.space_after = Pt(6)
    return p


def add_bullets(doc, items):
    table = doc.add_table(rows=len(items), cols=2)
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    table.style = "Table Grid"
    for index, item in enumerate(items, 1):
        set_cell_text(table.rows[index - 1].cells[0], str(index), True, "FFFFFF")
        shade(table.rows[index - 1].cells[0], GREEN)
        set_cell_text(table.rows[index - 1].cells[1], item)


def add_image(doc, filename, caption):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.add_run().add_picture(str(SHOTS / filename), width=Inches(5.55))
    cp = doc.add_paragraph(caption)
    cp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    for run in cp.runs:
        run.font.name = "Microsoft YaHei"
        run._element.rPr.rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
        run.font.size = Pt(9)
        run.font.color.rgb = RGBColor(99, 112, 107)


doc = Document(SOURCE)
normal = doc.styles["Normal"]
normal.font.name = "Microsoft YaHei"
normal._element.rPr.rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
normal.font.size = Pt(11)

title = doc.add_paragraph()
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = title.add_run("智慧食堂销售报价：5 步上手")
run.bold = True
run.font.name = "Microsoft YaHei"
run._element.rPr.rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
run.font.size = Pt(24)
run.font.color.rgb = RGBColor.from_string(GREEN)
subtitle = doc.add_paragraph("给第一次使用系统的销售｜标准报价快速操作手册")
subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
subtitle.runs[0].font.size = Pt(11)
subtitle.runs[0].font.color.rgb = RGBColor(99, 112, 107)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("报价从“报价单”开始；选择套餐生成产品，不要一个个添加产品。")
run.bold = True
run.font.size = Pt(13)
run.font.color.rgb = RGBColor.from_string(GREEN)

add_heading(doc, "一分钟速查", 1)
table = doc.add_table(rows=6, cols=3)
table.alignment = WD_TABLE_ALIGNMENT.CENTER
table.style = "Table Grid"
headers = ["步骤", "你要做什么", "点击哪里"]
for i, text in enumerate(headers):
    set_cell_text(table.rows[0].cells[i], text, True, "FFFFFF")
    shade(table.rows[0].cells[i], GREEN)
rows = [
    ("1", "进入销售工作台", "报价单"),
    ("2", "建立报价", "新建；填写客户、项目名称、客户类型"),
    ("3", "选择产品组合", "选择套餐生成报价"),
    ("4", "检查产品和金额", "产品、数量、单价、总计"),
    ("5", "发给客户", "导出客户Excel"),
]
for r_idx, row in enumerate(rows, 1):
    for c_idx, text in enumerate(row):
        set_cell_text(table.rows[r_idx].cells[c_idx], text, c_idx == 0, GREEN if c_idx == 0 else None)
    if r_idx % 2:
        for cell in table.rows[r_idx].cells:
            shade(cell, "F4F8F6")

steps = [
    ("第 1 步：进入“报价单”", ["点击顶部“报价单”。", "点击左上角“新建”。"], "01-sales-home.png", "销售报价单入口"),
    ("第 2 步：只填 3 项客户信息", ["客户：选择这次报价的客户。", "项目名称：例如“XX医院智慧食堂建设项目”。", "客户类型：医院、学校、企业、政府等。", "不要点击“添加产品”逐项找设备。"], "02-new-quotation.png", "只填写客户、项目名称和客户类型"),
    ("第 3 步：选择套餐生成报价", ["确认“本次采用套餐”。", "检查产品和默认数量。", "需要可选设备时勾选“加入可选产品”。", "点击“使用套餐生成报价”。"], "03-select-package.png", "选择套餐并直接生成报价"),
    ("第 4 步：检查产品、数量和金额", ["产品是不是客户需要的。", "数量是不是项目实际数量。", "销售单价和页面总计是否正确。", "普通项目只调整数量。"], "04-quotation-result.png", "生成后的报价明细"),
    ("第 5 步：导出客户 Excel", ["点击顶部“导出客户Excel”。", "正式发送前确认客户名称、数量、税率、付款条款和有效期。", "客户版不会显示采购成本、供应商和内部毛利。"], "04-quotation-result.png", "顶部导出客户Excel"),
]
for idx, (heading, bullets, image, caption) in enumerate(steps):
    doc.add_page_break()
    add_heading(doc, heading, 1)
    add_bullets(doc, bullets)
    add_image(doc, image, caption)

doc.add_page_break()
add_heading(doc, "什么时候才点“高级配置”", 1)
add_bullets(doc, [
    "需要按高峰人数计算设备数量；",
    "同时存在称重、自选、档口等多种就餐模式；",
    "客户要求新产品、改型号或改参数；",
    "涉及现场点位、接口、服务器或复杂交付。",
])
warning = doc.add_table(rows=1, cols=1)
warning.style = "Table Grid"
set_cell_text(warning.cell(0, 0), "普通标准报价不要先进入高级配置。", True, "754F00")
shade(warning.cell(0, 0), WARN)
add_image(doc, "06-advanced-only.png", "高级配置只用于复杂项目")

add_heading(doc, "三个不要", 1)
add_bullets(doc, [
    "不要一个个添加产品：优先选择套餐或复制历史报价；",
    "不要随意改低价：低价或非标走“非标/低价”；",
    "不要直接确认销售订单：客户接受、商务审核和合同确认后再成交。",
])
add_body(doc, "验证环境：本地 Odoo 19 Community｜插件版本 19.0.7.0.0｜2026-08-25")

doc.save(OUTPUT)
print(OUTPUT)
