"""将PPT内容生成PPTX文件（16:9宽屏）"""
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.shapes import MSO_SHAPE
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.oxml.ns import qn
from lxml import etree

# 16:9 宽屏：13.333 × 7.5 英寸
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)

# 配色
BG_GRADIENT_TOP = RGBColor(0xF5, 0xF7, 0xFA)
BG_GRADIENT_BTM = RGBColor(0xE8, 0xF0, 0xF7)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_TEXT = RGBColor(0x1E, 0x3A, 0x5F)
GRAY_TEXT = RGBColor(0x7F, 0x8C, 0x8D)
SUB_GRAY = RGBColor(0x95, 0xA5, 0xA6)
BODY_GRAY = RGBColor(0x5D, 0x6D, 0x7E)
SECONDARY = RGBColor(0x34, 0x49, 0x5E)

# 卡片配色
GREEN = RGBColor(0x27, 0xAE, 0x60)
GREEN_DARK = RGBColor(0x16, 0xA0, 0x85)
ORANGE = RGBColor(0xF3, 0x9C, 0x12)
ORANGE_DARK = RGBColor(0xE6, 0x7E, 0x22)
RED = RGBColor(0xE7, 0x4C, 0x3C)
RED_DARK = RGBColor(0xC0, 0x39, 0x2B)
BLUE = RGBColor(0x34, 0x98, 0xDB)
BLUE_DARK = RGBColor(0x29, 0x80, 0xB9)
PURPLE = RGBColor(0x9B, 0x59, 0xB6)
PURPLE_DARK = RGBColor(0x8E, 0x44, 0xAD)
TEAL = RGBColor(0x1A, 0xBC, 0x9C)


def set_slide_bg(slide):
    """设置淡蓝色渐变背景"""
    bg = slide.background
    fill = bg.fill
    fill.solid()
    fill.fore_color.rgb = BG_GRADIENT_TOP
    # 用矩形铺满
    rect = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height)
    rect.fill.solid()
    rect.fill.fore_color.rgb = BG_GRADIENT_TOP
    rect.line.fill.background()
    rect.shadow.inherit = False


def add_text(slide, x, y, w, h, text, *, size=14, color=DARK_TEXT,
             bold=False, align=PP_ALIGN.LEFT, anchor=MSO_ANCHOR.TOP,
             font_name="Microsoft YaHei", italic=False):
    """通用文字框"""
    tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
    tf = tb.text_frame
    tf.margin_left = Inches(0.05)
    tf.margin_right = Inches(0.05)
    tf.margin_top = Inches(0.02)
    tf.margin_bottom = Inches(0.02)
    tf.word_wrap = True
    tf.vertical_anchor = anchor
    p = tf.paragraphs[0]
    p.alignment = align
    run = p.add_run()
    run.text = text
    run.font.size = Pt(size)
    run.font.bold = bold
    run.font.italic = italic
    run.font.color.rgb = color
    run.font.name = font_name
    # 设置东亚字体
    rPr = run._r.get_or_add_rPr()
    eastAsia = etree.SubElement(rPr, qn('a:ea'), typeface=font_name)
    return tb, tf, p, run


def add_title(slide, num, title_text, subtitle_text):
    """页码 + 主标题 + 副标题"""
    # 页码
    add_text(slide, 11.4, 0.25, 1.6, 0.3, num, size=11, color=SUB_GRAY, bold=True, align=PP_ALIGN.RIGHT)

    # 蓝色竖条
    bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(0.6), Inches(0.7), Inches(0.08), Inches(0.7))
    bar.fill.solid()
    bar.fill.fore_color.rgb = BLUE
    bar.line.fill.background()
    bar.shadow.inherit = False

    # 主标题
    add_text(slide, 0.85, 0.65, 12.0, 0.8, title_text, size=30, color=DARK_TEXT, bold=True)

    # 副标题
    add_text(slide, 0.85, 1.45, 12.0, 0.4, subtitle_text, size=13, color=GRAY_TEXT)


def add_card(slide, x, y, w, h, *, fill_color=WHITE, border_color=None, border_width=0):
    """添加圆角卡片"""
    card = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
                                   Inches(x), Inches(y), Inches(w), Inches(h))
    card.fill.solid()
    card.fill.fore_color.rgb = fill_color
    if border_color:
        card.line.color.rgb = border_color
        card.line.width = Pt(border_width)
    else:
        card.line.fill.background()
    card.shadow.inherit = False
    # 微调圆角
    try:
        card.adjustments[0] = 0.06
    except Exception:
        pass
    return card


# ============== 第 1 页 ==============
def build_slide1():
    blank = prs.slide_layouts[6]
    s = prs.slides.add_slide(blank)
    set_slide_bg(s)

    add_title(s, "01 / 03", "按体力活动分级 · 熟米饭摄入量",
              "份量按「熟重」算 · 白米升糖快，杂粮饭更适合控糖")

    # 3 个分级卡片
    levels = [
        {
            "tag": "久坐 / 轻体力",
            "desc": "办公室工作、很少运动",
            "amount": "100",
            "unit": "g / 餐",
            "equiv": "≈ 小半碗 · 碗底薄薄一层\n优先杂粮饭（糙米、燕麦、杂豆 ≥ 一半）",
            "color": GREEN,
        },
        {
            "tag": "中等体力",
            "desc": "日常走路多、每天运动 30–60 分钟",
            "amount": "120–150",
            "unit": "g / 餐",
            "equiv": "≈ 半碗\n搭配足量蔬菜 + 蛋白质",
            "color": ORANGE,
        },
        {
            "tag": "重体力 / 大力量训练",
            "desc": "工地、长时间健身",
            "amount": "150–200",
            "unit": "g / 餐",
            "equiv": "≈ 大半碗，不建议满碗\n运动前后适量补充",
            "color": RED,
        },
    ]

    card_w = 3.9
    card_h = 4.0
    gap = 0.25
    total_w = card_w * 3 + gap * 2
    start_x = (13.333 - total_w) / 2
    start_y = 2.0

    for i, lv in enumerate(levels):
        x = start_x + i * (card_w + gap)
        # 卡片
        add_card(s, x, start_y, card_w, card_h)
        # 顶部色条（用一个矩形）
        bar = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(x + 0.05), Inches(start_y + 0.05),
                                  Inches(card_w - 0.1), Inches(0.05))
        bar.fill.solid()
        bar.fill.fore_color.rgb = lv["color"]
        bar.line.fill.background()
        bar.shadow.inherit = False

        # 标签徽章
        tag_w = 1.8
        badge = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
                                    Inches(x + 0.3), Inches(start_y + 0.25),
                                    Inches(tag_w), Inches(0.4))
        badge.fill.solid()
        badge.fill.fore_color.rgb = lv["color"]
        badge.line.fill.background()
        badge.shadow.inherit = False
        try:
            badge.adjustments[0] = 0.4
        except Exception:
            pass
        tf = badge.text_frame
        tf.margin_left = Inches(0.05)
        tf.margin_right = Inches(0.05)
        tf.margin_top = Inches(0.02)
        tf.margin_bottom = Inches(0.02)
        tf.vertical_anchor = MSO_ANCHOR.MIDDLE
        p = tf.paragraphs[0]
        p.alignment = PP_ALIGN.CENTER
        run = p.add_run()
        run.text = lv["tag"]
        run.font.size = Pt(11)
        run.font.bold = True
        run.font.color.rgb = WHITE
        run.font.name = "Microsoft YaHei"
        rPr = run._r.get_or_add_rPr()
        etree.SubElement(rPr, qn('a:ea'), typeface="Microsoft YaHei")

        # 描述
        add_text(s, x + 0.3, start_y + 0.75, card_w - 0.6, 0.4,
                 lv["desc"], size=12, color=SECONDARY, bold=True)

        # 数量（大字）
        tb = s.shapes.add_textbox(Inches(x + 0.3), Inches(start_y + 1.2),
                                   Inches(card_w - 0.6), Inches(1.0))
        tf = tb.text_frame
        tf.vertical_anchor = MSO_ANCHOR.MIDDLE
        p = tf.paragraphs[0]
        p.alignment = PP_ALIGN.LEFT
        run = p.add_run()
        run.text = lv["amount"]
        run.font.size = Pt(44)
        run.font.bold = True
        run.font.color.rgb = DARK_TEXT
        run.font.name = "Microsoft YaHei"
        rPr = run._r.get_or_add_rPr()
        etree.SubElement(rPr, qn('a:ea'), typeface="Microsoft YaHei")
        run2 = p.add_run()
        run2.text = "  " + lv["unit"]
        run2.font.size = Pt(14)
        run2.font.color.rgb = GRAY_TEXT
        run2.font.name = "Microsoft YaHei"
        rPr2 = run2._r.get_or_add_rPr()
        etree.SubElement(rPr2, qn('a:ea'), typeface="Microsoft YaHei")

        # 分隔虚线（用一个浅色矩形代替）
        div = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(x + 0.3), Inches(start_y + 2.4),
                                Inches(card_w - 0.6), Inches(0.01))
        div.fill.solid()
        div.fill.fore_color.rgb = RGBColor(0xEC, 0xF0, 0xF1)
        div.line.fill.background()
        div.shadow.inherit = False

        # 等价说明
        tb = s.shapes.add_textbox(Inches(x + 0.3), Inches(start_y + 2.5),
                                   Inches(card_w - 0.6), Inches(1.2))
        tf = tb.text_frame
        tf.word_wrap = True
        lines = lv["equiv"].split("\n")
        for i2, line in enumerate(lines):
            if i2 == 0:
                p = tf.paragraphs[0]
            else:
                p = tf.add_paragraph()
            p.alignment = PP_ALIGN.LEFT
            run = p.add_run()
            run.text = line
            run.font.size = Pt(11)
            run.font.color.rgb = SUB_GRAY
            run.font.name = "Microsoft YaHei"
            rPr = run._r.get_or_add_rPr()
            etree.SubElement(rPr, qn('a:ea'), typeface="Microsoft YaHei")

    # 底部糖尿病提示条
    bar_y = start_y + card_h + 0.3
    bar_h = 0.7
    tip = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
                              Inches(0.6), Inches(bar_y),
                              Inches(12.13), Inches(bar_h))
    tip.fill.solid()
    tip.fill.fore_color.rgb = RGBColor(0xFF, 0xF5, 0xF5)
    tip.line.color.rgb = RED
    tip.line.width = Pt(0)
    tip.shadow.inherit = False
    try:
        tip.adjustments[0] = 0.2
    except Exception:
        pass

    # 左侧红色竖条（用另一个细矩形叠加）
    bar = s.shapes.add_shape(MSO_SHAPE.RECTANGLE,
                              Inches(0.6), Inches(bar_y),
                              Inches(0.08), Inches(bar_h))
    bar.fill.solid()
    bar.fill.fore_color.rgb = RED
    bar.line.fill.background()
    bar.shadow.inherit = False

    # 红色徽章
    badge = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
                                Inches(0.85), Inches(bar_y + 0.18),
                                Inches(1.2), Inches(0.35))
    badge.fill.solid()
    badge.fill.fore_color.rgb = RED
    badge.line.fill.background()
    badge.shadow.inherit = False
    try:
        badge.adjustments[0] = 0.3
    except Exception:
        pass
    tf = badge.text_frame
    tf.vertical_anchor = MSO_ANCHOR.MIDDLE
    p = tf.paragraphs[0]
    p.alignment = PP_ALIGN.CENTER
    run = p.add_run()
    run.text = "糖友提示"
    run.font.size = Pt(11)
    run.font.bold = True
    run.font.color.rgb = WHITE
    run.font.name = "Microsoft YaHei"
    rPr = run._r.get_or_add_rPr()
    etree.SubElement(rPr, qn('a:ea'), typeface="Microsoft YaHei")

    # 提示文字
    add_text(s, 2.2, bar_y + 0.1, 10.5, 0.55,
             "多数男性糖尿病人群起步建议：每餐熟重 100g 以内，监测餐后 2 小时血糖再微调。",
             size=13, color=RED_DARK, bold=True)


# ============== 第 2 页 ==============
def build_slide2():
    blank = prs.slide_layouts[6]
    s = prs.slides.add_slide(blank)
    set_slide_bg(s)

    add_title(s, "02 / 03", "控血糖，不只是少吃米饭",
              "5 个关键做法，效果常常比「减量」更明显")

    tips = [
        {"num": "1", "title": "调整吃饭顺序", "desc": "先喝汤 / 蔬菜 → 吃肉 / 蛋 / 豆制品 → 最后吃米饭，能显著压低血糖峰值。",
         "color": GREEN, "color_dark": GREEN_DARK},
        {"num": "2", "title": "不要单独吃米饭", "desc": "米饭必须搭配足量蔬菜 + 蛋白质。避免「白米饭 + 咸菜」这种单一碳水。",
         "color": ORANGE, "color_dark": ORANGE_DARK},
        {"num": "3", "title": "换主食种类", "desc": "杂粮饭（糙米、藜麦、红豆、鹰嘴豆等）升糖远低于纯白米饭；粥、烂面条、糯米饭升糖更高，尽量少。",
         "color": PURPLE, "color_dark": PURPLE_DARK},
        {"num": "4", "title": "注意烹饪方式", "desc": "米饭不要煮太软烂，不要泡饭吃；保留一定咀嚼感。",
         "color": TEAL, "color_dark": TEAL},
        {"num": "5", "title": "放慢进餐速度", "desc": "一餐 ≥ 15 分钟。细嚼慢咽有助平稳血糖，也减少总摄入量。",
         "color": RED, "color_dark": RED_DARK},
    ]

    # 5个卡片布局：前4个 2x2，最后1个跨整行
    card_w_full = 12.13
    card_w_half = 5.96
    card_h = 1.35
    gap_x = 0.2
    gap_y = 0.2
    start_x = 0.6
    start_y = 2.05

    positions = [
        (start_x, start_y, card_w_half, card_h),                                    # 1
        (start_x + card_w_half + gap_x, start_y, card_w_half, card_h),              # 2
        (start_x, start_y + card_h + gap_y, card_w_half, card_h),                   # 3
        (start_x + card_w_half + gap_x, start_y + card_h + gap_y, card_w_half, card_h),  # 4
        (start_x, start_y + (card_h + gap_y) * 2, card_w_full, card_h),             # 5
    ]

    for tip, (x, y, w, h) in zip(tips, positions):
        # 卡片
        add_card(s, x, y, w, h)

        # 左侧色条
        bar = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(x + 0.05), Inches(y + 0.15),
                                  Inches(0.08), Inches(h - 0.3))
        bar.fill.solid()
        bar.fill.fore_color.rgb = tip["color"]
        bar.line.fill.background()
        bar.shadow.inherit = False

        # 圆形数字
        num_size = 0.5
        circle = s.shapes.add_shape(MSO_SHAPE.OVAL,
                                     Inches(x + 0.3), Inches(y + (h - num_size) / 2),
                                     Inches(num_size), Inches(num_size))
        circle.fill.solid()
        circle.fill.fore_color.rgb = tip["color"]
        circle.line.fill.background()
        circle.shadow.inherit = False
        tf = circle.text_frame
        tf.vertical_anchor = MSO_ANCHOR.MIDDLE
        p = tf.paragraphs[0]
        p.alignment = PP_ALIGN.CENTER
        run = p.add_run()
        run.text = tip["num"]
        run.font.size = Pt(20)
        run.font.bold = True
        run.font.color.rgb = WHITE
        run.font.name = "Microsoft YaHei"
        rPr = run._r.get_or_add_rPr()
        etree.SubElement(rPr, qn('a:ea'), typeface="Microsoft YaHei")

        # 标题 + 描述
        text_x = x + 0.95
        text_w = w - 1.1
        tb = s.shapes.add_textbox(Inches(text_x), Inches(y + 0.18),
                                   Inches(text_w), Inches(h - 0.36))
        tf = tb.text_frame
        tf.word_wrap = True
        tf.vertical_anchor = MSO_ANCHOR.MIDDLE

        p1 = tf.paragraphs[0]
        p1.alignment = PP_ALIGN.LEFT
        run1 = p1.add_run()
        run1.text = tip["title"]
        run1.font.size = Pt(15)
        run1.font.bold = True
        run1.font.color.rgb = DARK_TEXT
        run1.font.name = "Microsoft YaHei"
        rPr1 = run1._r.get_or_add_rPr()
        etree.SubElement(rPr1, qn('a:ea'), typeface="Microsoft YaHei")

        p2 = tf.add_paragraph()
        p2.alignment = PP_ALIGN.LEFT
        run2 = p2.add_run()
        run2.text = tip["desc"]
        run2.font.size = Pt(11)
        run2.font.color.rgb = BODY_GRAY
        run2.font.name = "Microsoft YaHei"
        rPr2 = run2._r.get_or_add_rPr()
        etree.SubElement(rPr2, qn('a:ea'), typeface="Microsoft YaHei")


# ============== 第 3 页 ==============
def build_slide3():
    blank = prs.slide_layouts[6]
    s = prs.slides.add_slide(blank)
    set_slide_bg(s)

    add_title(s, "03 / 03", "目测法 · 调整信号 · 重要提醒",
              "不用秤 · 看信号调份量 · 个体差异以血糖实测为准")

    col_gap = 0.3
    col_w = (12.13 - col_gap) / 2
    start_y = 2.0
    start_x = 0.6
    left_x = start_x
    right_x = start_x + col_w + col_gap

    # ===== 左栏 =====

    # 拳头对照卡片
    fist_h = 2.5
    add_card(s, left_x, start_y, col_w, fist_h)

    # 标题
    tb = s.shapes.add_textbox(Inches(left_x + 0.25), Inches(start_y + 0.2),
                               Inches(col_w - 0.5), Inches(0.5))
    tf = tb.text_frame
    p = tf.paragraphs[0]
    p.alignment = PP_ALIGN.LEFT
    run = p.add_run()
    run.text = "✊  简单目测法（拳头对照）"
    run.font.size = Pt(18)
    run.font.bold = True
    run.font.color.rgb = DARK_TEXT
    run.font.name = "Microsoft YaHei"
    rPr = run._r.get_or_add_rPr()
    etree.SubElement(rPr, qn('a:ea'), typeface="Microsoft YaHei")

    # 拳头黄色背景框
    fist_y = start_y + 0.8
    fist_box_h = 1.5
    fb = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
                             Inches(left_x + 0.25), Inches(fist_y),
                             Inches(col_w - 0.5), Inches(fist_box_h))
    fb.fill.solid()
    fb.fill.fore_color.rgb = RGBColor(0xFF, 0xF9, 0xE6)
    fb.line.fill.background()
    fb.shadow.inherit = False
    try:
        fb.adjustments[0] = 0.1
    except Exception:
        pass

    # 拳头 emoji
    add_text(s, left_x + 0.4, fist_y + 0.25, 1.0, 1.0, "✊",
             size=54, color=ORANGE_DARK, bold=True, anchor=MSO_ANCHOR.MIDDLE)

    # 文字
    tb = s.shapes.add_textbox(Inches(left_x + 1.4), Inches(fist_y + 0.15),
                               Inches(col_w - 1.8), Inches(fist_box_h - 0.3))
    tf = tb.text_frame
    tf.word_wrap = True
    tf.vertical_anchor = MSO_ANCHOR.MIDDLE

    p1 = tf.paragraphs[0]
    run = p1.add_run()
    run.text = "100g 熟米饭 ≈ 一个拳头"
    run.font.size = Pt(20)
    run.font.bold = True
    run.font.color.rgb = RGBColor(0xD3, 0x54, 0x00)
    run.font.name = "Microsoft YaHei"
    rPr = run._r.get_or_add_rPr()
    etree.SubElement(rPr, qn('a:ea'), typeface="Microsoft YaHei")

    p2 = tf.add_paragraph()
    run = p2.add_run()
    run.text = "握紧拳头的大小，就是一餐主食的量。"
    run.font.size = Pt(11)
    run.font.color.rgb = GRAY_TEXT
    run.font.name = "Microsoft YaHei"
    rPr = run._r.get_or_add_rPr()
    etree.SubElement(rPr, qn('a:ea'), typeface="Microsoft YaHei")

    p3 = tf.add_paragraph()
    run = p3.add_run()
    run.text = "轻体力男性参考：一餐一拳主食。"
    run.font.size = Pt(11)
    run.font.color.rgb = GRAY_TEXT
    run.font.name = "Microsoft YaHei"
    rPr = run._r.get_or_add_rPr()
    etree.SubElement(rPr, qn('a:ea'), typeface="Microsoft YaHei")

    # 调整信号卡片
    sig_y = start_y + fist_h + 0.2
    sig_h = 2.0
    add_card(s, left_x, sig_y, col_w, sig_h)

    # 标题
    add_text(s, left_x + 0.25, sig_y + 0.2, col_w - 0.5, 0.5,
             "📈  需要调整的信号", size=18, color=DARK_TEXT, bold=True)

    # 信号项 1
    sig1_y = sig_y + 0.8
    sig1 = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
                               Inches(left_x + 0.25), Inches(sig1_y),
                               Inches(col_w - 0.5), Inches(0.5))
    sig1.fill.solid()
    sig1.fill.fore_color.rgb = RGBColor(0xFF, 0xF5, 0xF5)
    sig1.line.fill.background()
    sig1.shadow.inherit = False
    try:
        sig1.adjustments[0] = 0.3
    except Exception:
        pass
    # 左侧红色条
    bar = s.shapes.add_shape(MSO_SHAPE.RECTANGLE,
                              Inches(left_x + 0.25), Inches(sig1_y),
                              Inches(0.06), Inches(0.5))
    bar.fill.solid()
    bar.fill.fore_color.rgb = RED
    bar.line.fill.background()
    bar.shadow.inherit = False

    add_text(s, left_x + 0.4, sig1_y + 0.05, col_w - 0.7, 0.45,
             "⚠️  餐后 2 小时血糖偏高 → 减少米饭量，优先增加蔬菜和蛋白",
             size=11, color=RED_DARK, bold=True, anchor=MSO_ANCHOR.MIDDLE)

    # 信号项 2
    sig2_y = sig1_y + 0.65
    sig2 = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
                               Inches(left_x + 0.25), Inches(sig2_y),
                               Inches(col_w - 0.5), Inches(0.5))
    sig2.fill.solid()
    sig2.fill.fore_color.rgb = RGBColor(0xFF, 0xF9, 0xE6)
    sig2.line.fill.background()
    sig2.shadow.inherit = False
    try:
        sig2.adjustments[0] = 0.3
    except Exception:
        pass
    bar = s.shapes.add_shape(MSO_SHAPE.RECTANGLE,
                              Inches(left_x + 0.25), Inches(sig2_y),
                              Inches(0.06), Inches(0.5))
    bar.fill.solid()
    bar.fill.fore_color.rgb = ORANGE_DARK
    bar.line.fill.background()
    bar.shadow.inherit = False

    add_text(s, left_x + 0.4, sig2_y + 0.05, col_w - 0.7, 0.45,
             "⚡  经常乏力 / 饥饿 / 低血糖 → 少量加主食，优先放在运动前后",
             size=11, color=ORANGE_DARK, bold=True, anchor=MSO_ANCHOR.MIDDLE)

    # ===== 右栏：重要提醒 =====
    right_h = fist_h + 0.2 + sig_h
    add_card(s, right_x, start_y, col_w, right_h)

    # 标题
    add_text(s, right_x + 0.25, start_y + 0.2, col_w - 0.5, 0.5,
             "⚠️  重要提醒", size=18, color=DARK_TEXT, bold=True)

    # 红色提醒框
    alert_y = start_y + 0.8
    alert_h = right_h - 1.4
    ab = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
                             Inches(right_x + 0.25), Inches(alert_y),
                             Inches(col_w - 0.5), Inches(alert_h))
    ab.fill.solid()
    ab.fill.fore_color.rgb = RGBColor(0xFF, 0xF5, 0xF5)
    ab.line.color.rgb = RED
    ab.line.width = Pt(1.5)
    ab.shadow.inherit = False
    try:
        ab.adjustments[0] = 0.08
    except Exception:
        pass

    # 副标题
    add_text(s, right_x + 0.45, alert_y + 0.15, col_w - 0.9, 0.4,
             "⚠ 关键注意事项", size=14, color=RED_DARK, bold=True)

    # 列表项
    items = [
        "如果合并 肾功能不全，杂粮不能随便多吃，要遵医嘱",
        "每个人对米饭的血糖反应差异很大",
        "最靠谱的方法：固定份量，测餐后 2 小时血糖，看自己的反应",
        "如有糖尿病，最终以 医生 / 营养师方案 为准",
    ]
    item_y = alert_y + 0.65
    line_h = 0.55
    for i, txt in enumerate(items):
        y = item_y + i * line_h
        # 警示符号
        add_text(s, right_x + 0.45, y, 0.3, 0.5,
                 "⚠", size=13, color=RED, bold=True, anchor=MSO_ANCHOR.MIDDLE)
        add_text(s, right_x + 0.75, y, col_w - 1.0, 0.5,
                 txt, size=12, color=DARK_TEXT, anchor=MSO_ANCHOR.MIDDLE)

    # 底部金句提示
    quote_y = alert_y + alert_h + 0.15
    quote_h = 0.65
    qb = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
                             Inches(right_x + 0.25), Inches(quote_y),
                             Inches(col_w - 0.5), Inches(quote_h))
    qb.fill.solid()
    qb.fill.fore_color.rgb = RGBColor(0xE8, 0xF4, 0xF8)
    qb.line.fill.background()
    qb.shadow.inherit = False
    try:
        qb.adjustments[0] = 0.2
    except Exception:
        pass

    tb = s.shapes.add_textbox(Inches(right_x + 0.25), Inches(quote_y + 0.05),
                               Inches(col_w - 0.5), Inches(quote_h - 0.1))
    tf = tb.text_frame
    tf.vertical_anchor = MSO_ANCHOR.MIDDLE
    tf.word_wrap = True
    p = tf.paragraphs[0]
    p.alignment = PP_ALIGN.CENTER
    run = p.add_run()
    run.text = "💡 记住一句话："
    run.font.size = Pt(12)
    run.font.color.rgb = DARK_TEXT
    run.font.name = "Microsoft YaHei"
    rPr = run._r.get_or_add_rPr()
    etree.SubElement(rPr, qn('a:ea'), typeface="Microsoft YaHei")

    run2 = p.add_run()
    run2.text = "同份量看顺序，同顺序看种类，同种类看血糖。"
    run2.font.size = Pt(12)
    run2.font.bold = True
    run2.font.color.rgb = BLUE_DARK
    run2.font.name = "Microsoft YaHei"
    rPr2 = run2._r.get_or_add_rPr()
    etree.SubElement(rPr2, qn('a:ea'), typeface="Microsoft YaHei")


# ===== 构建 =====
build_slide1()
build_slide2()
build_slide3()

# 保存
output = "/var/www/html/share/rice_blood_sugar_pptx.pptx"
prs.save(output)
print(f"✅ 已生成: {output}")
print(f"   文件大小: {__import__('os').path.getsize(output) / 1024:.1f} KB")