#!/usr/bin/env python3
"""Retained 13-page main + 8-page appendix variant; current 12-page final uses build_park_five_force_final_12.py."""
from __future__ import annotations

from copy import deepcopy
from io import BytesIO
import importlib.util
from pathlib import Path
import shutil

from pptx import Presentation
from pptx.enum.text import MSO_ANCHOR, PP_ALIGN


HERE = Path(__file__).resolve().parent
BASE_SCRIPT = HERE / "build_park_five_force_tech_deck.py"
SPEC = importlib.util.spec_from_file_location("park_tech", BASE_SCRIPT)
if SPEC is None or SPEC.loader is None:
    raise RuntimeError("cannot load base slide helpers")
m = importlib.util.module_from_spec(SPEC)
SPEC.loader.exec_module(m)

BUILD = m.WORK / "build/park-five-force-5min-deck"
OUTPUT = BUILD / "康比特企业园区智慧食堂五力路演方案_5分钟健康服务点传播版_20260815.pptx"
DESKTOP = Path("/Users/jack/Desktop/智慧食堂抖音价值营销方案_20260814/01-最终交付/康比特企业园区智慧食堂五力路演方案_5分钟健康服务点传播版_20260815.pptx")
LOCATION_MAP = m.WORK / "assets/park-health-point-location-source.png"
HEALTH_POINT_3D = m.WORK / "assets/park-health-service-point-3d.png"


def build():
    for required in [m.TEMPLATE, m.MANUAL]:
        if not required.exists():
            raise FileNotFoundError(required)
    BUILD.mkdir(parents=True, exist_ok=True)
    DESKTOP.parent.mkdir(parents=True, exist_ok=True)

    prs = Presentation(str(m.TEMPLATE))
    original_slide_count = len(prs.slides)
    base_slide = prs.slides[1]
    base_shapes = [shape._element for shape in list(base_slide.shapes)[:51]]
    logo_blob = list(base_slide.shapes)[-1].image.blob
    blank = prs.slide_layouts[6]

    def new_slide():
        slide = prs.slides.add_slide(blank)
        m.add_background(prs, slide, base_shapes, logo_blob)
        return slide

    # 01 Cover
    s = new_slide()
    m.add_pill(s, "KANGBITE · ENTERPRISE PARK", 0.78, 0.72, 3.05, fill=m.ORANGE, size=11)
    m.add_multi_text(s, [("康比特企业园区智慧食堂\n", m.WHITE, True, 31), ("五力路演方案", m.CYAN, True, 40)], 1.08, 2.05, 9.25, 1.78)
    m.add_text(s, "一个园区，一套健康团餐运营底座", 1.10, 4.15, 8.15, 0.58, size=23, color=m.SOFT, bold=True)
    m.add_line(s, 1.10, 4.92, 9.82, 4.92, color=m.ORANGE, width=2.2)
    m.add_text(s, "品牌力 × 场景力 × 产品力 × 数据力 × 增长力", 1.10, 5.18, 8.25, 0.42, size=15, color=m.WHITE)
    m.add_text(s, "5 MINUTE ROADSHOW", 9.30, 6.42, 3.05, 0.34, size=12, color=m.CYAN, bold=True, align=PP_ALIGN.CENTER)

    # 02 SOM only
    s = new_slide(); m.add_title(s, 2, "首个可赢市场（SOM）：北京核心商务区企业园区")
    m.add_text(s, "先赢下 20 家标杆企业，再复制一套园区标准包。", 0.86, 1.34, 11.62, 0.64, size=27, color=m.WHITE, bold=True, align=PP_ALIGN.CENTER)
    stats = [
        ("20家", "首年北京国贸 / CBD\n500 人以上标杆企业"),
        ("50–100万", "目标签约客单价\n园区软硬件与服务组合"),
        ("1000–1500万", "首年目标营收\n以标杆项目带动复制"),
        ("3城 / 200家", "三年进入 3 个一线城市\n签约 200 家企业")]
    for i,(num,label) in enumerate(stats):
        x=0.70+i*3.10
        m.add_card(s,x,2.28,2.78,3.05,fill=m.CARD,line=m.ORANGE if i==0 else m.CYAN,radius=True,width=1.2)
        m.add_text(s,num,x+0.16,2.65,2.46,0.75,size=27,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
        m.add_text(s,label,x+0.20,3.70,2.38,1.02,size=12.3,color=m.SOFT,align=PP_ALIGN.CENTER,valign=MSO_ANCHOR.MIDDLE)
    m.add_text(s, "唯一主场景：千人级、多组织、多账户、多系统协同的企业园区智慧食堂。", 0.95, 5.87, 11.42, 0.60, size=20, color=m.CYAN, bold=True, align=PP_ALIGN.CENTER)

    # 03 Customers + pains
    s = new_slide(); m.add_title(s, 3, "五类角色，共同面对五个运营断点", "客户画像与核心问题")
    items = [
        ("园区运营方", "标准不统一", "品牌形象与运营绩效难统一"),
        ("后勤 / 食堂", "高峰不能停", "班次集中、弱网、设备稳定"),
        ("财务 / 人力", "规则不能乱", "补贴、计次、访客、招待、对账"),
        ("信息化团队", "系统不能散", "OA、一卡通、财务、门禁互联"),
        ("园区员工", "健康不能虚", "少排队、吃得明白、持续反馈")]
    for i,(role,pain,detail) in enumerate(items):
        x=0.56+i*2.51
        m.add_card(s,x,1.72,2.25,4.42,fill=m.CARD,line=m.ORANGE if i==0 else m.CYAN,radius=True,width=1.15)
        m.add_text(s,f"0{i+1}",x+0.18,1.94,0.48,0.32,size=13,color=m.ORANGE,bold=True)
        m.add_text(s,role,x+0.18,2.43,1.89,0.68,size=18,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
        m.add_text(s,pain,x+0.18,3.38,1.89,0.55,size=19,color=m.CYAN,bold=True,align=PP_ALIGN.CENTER)
        m.add_text(s,detail,x+0.20,4.28,1.85,1.12,size=11.5,color=m.SOFT,align=PP_ALIGN.CENTER)
    m.add_text(s, "客户购买的不是一台设备，而是一套让五类角色每天都能持续使用的运营机制。", 0.92, 6.45, 11.48, 0.48, size=17.5, color=m.WHITE, bold=True, align=PP_ALIGN.CENTER)

    # 04 Who we are
    s = new_slide(); m.add_title(s, 4, "我们是谁：AI 营养智慧食堂", "产品手册结论：一平台 · 三系统 · N 硬件")
    m.add_text(s, "用统一数据平台连接结算、营养、食安与供应链，\n让员工吃得健康，让后勤管得透明，让财务对得清楚。", 0.82, 1.50, 5.52, 1.52, size=24, color=m.WHITE, bold=True, valign=MSO_ANCHOR.TOP)
    systems = [
        ("营养结算与健康管理", "多场景结算 · 账户补贴 · 营养反馈"),
        ("智慧食品安全监管", "晨检留样 · AI 识别 · 整改留痕"),
        ("智慧进销存与后厨运营", "采购验收 · 库存成本 · 经营分析")]
    for i,(title,body) in enumerate(systems):
        y=3.38+i*0.88
        m.add_card(s,0.82,y,5.50,0.70,fill=m.CARD,line=m.CYAN,radius=True,width=0.9)
        m.add_text(s,title,1.02,y+0.03,2.66,0.64,size=14,color=m.WHITE,bold=True)
        m.add_text(s,body,3.58,y+0.03,2.52,0.64,size=10.5,color=m.SOFT,align=PP_ALIGN.RIGHT)
    m.add_circle(s,8.43,2.25,2.35,fill=m.CARD_2,line=m.ORANGE,width=2.0)
    m.add_text(s,"统一\n数据平台",8.43,2.25,2.35,2.35,size=24,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
    for label,x,y in [("人",7.03,1.45),("货",10.87,1.45),("场",10.87,5.00),("健康",7.03,5.00)]:
        m.add_circle(s,x,y,1.16,fill=m.CARD,line=m.CYAN,width=1.2)
        m.add_text(s,label,x,y,1.16,1.16,size=14,color=m.CYAN,bold=True,align=PP_ALIGN.CENTER)

    # 05 Five forces
    s = new_slide(); m.add_title(s, 5, "五力协同：为什么必须是康比特", "信任 · 共鸣 · 证明 · 增值 · 成交")
    forces = [
        ("品牌力", "20余年运动营养服务经验\n形成专业信任"),
        ("场景力", "多企业、多班次、多账户\n形成精准共鸣"),
        ("产品力", "五大园区产品能力\n形成现场证明"),
        ("数据力", "体脂秤 + 智能跳绳 + AI 营养师\n形成健康闭环"),
        ("增长力", "抖音线索 + 数字体检\n形成商机与订单")]
    for i,(title,body) in enumerate(forces):
        m.force_card(s,i+1,title,body,0.55+i*2.52,2.08,w=2.26,h=3.22,accent=m.ORANGE if i==0 else m.CYAN)
    m.add_text(s, "设备完成结算，数据完成经营；专业建立信任，内容推动成交。", 0.95, 5.87, 11.42, 0.58, size=20, color=m.CYAN, bold=True, align=PP_ALIGN.CENTER)

    # 06 5+2 overview
    s = new_slide(); m.add_title(s, 6, "产品力：五项能力筑底，两大能力进阶", "5+2 原始高清总览")
    m.add_full_image(s, m.INFOGRAPHIC / "outputs/v2/00-overview-5-plus-2.png", x=1.88, y=1.31, h=5.70, frame=True)

    # 07 health service point at the user-selected park location
    s = new_slide(); m.add_title(s, 7, "园区健康服务点解决方案", "落位：箭头所指核心动线节点")
    for required in [LOCATION_MAP, HEALTH_POINT_3D]:
        if not required.exists():
            raise FileNotFoundError(required)
    m.add_card(s,0.58,1.37,3.38,4.86,fill=m.WHITE,line=m.CYAN,radius=False,width=1.0)
    s.shapes.add_picture(str(LOCATION_MAP),m.I(0.67),m.I(1.46),width=m.I(3.20))
    m.add_pill(s,"园区健康服务点",1.05,5.72,2.42,fill=m.ORANGE,size=11.0)
    m.add_image_cover(s,HEALTH_POINT_3D,4.18,1.43,8.42,3.52,frame=True)
    m.add_pill(s,"方案效果图",10.75,1.65,1.34,fill=m.BLUE,size=9.4)
    service_cards = [
        ("01", "智能体脂秤", "身体成分检测\n建立健康基线"),
        ("02", "智能跳绳", "运动任务执行\n自动记录运动量"),
        ("03", "AI 营养师", "解读体测与运动数据\n生成饮食建议"),
    ]
    for i,(num,title,body) in enumerate(service_cards):
        x=4.18+i*2.83
        m.add_card(s,x,5.22,2.58,1.16,fill=m.CARD,line=m.ORANGE if i==2 else m.CYAN,radius=True,width=1.0)
        m.add_text(s,num,x+0.13,5.35,0.36,0.28,size=11,color=m.ORANGE,bold=True)
        m.add_text(s,title,x+0.52,5.29,1.82,0.34,size=15,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
        m.add_text(s,body,x+0.16,5.70,2.26,0.54,size=9.8,color=m.SOFT,align=PP_ALIGN.CENTER)
    m.add_text(s,"测得准 · 动起来 · 吃得对：三类服务共用一个健康账户，并与食堂用餐数据持续联动。",3.98,6.53,8.78,0.42,size=15.8,color=m.CYAN,bold=True,align=PP_ALIGN.CENTER)

    # 08 communication plan
    s = new_slide(); m.add_title(s, 8, "传播方案：先让员工来体验，再让园区成为案例", "园区内激活 × 抖音外部获客")
    phases = [
        ("预热 7 天", "内部触达", ["园区悬念海报：健康服务点即将开放", "15 秒短片：体脂秤 × 跳绳 × AI 营养师", "企业微信问卷 + 体验预约", "园区负责人出镜说明"]),
        ("开放体验周", "现场爆点", ["一人一份健康基线", "一分钟智能跳绳挑战", "AI 营养师现场解读", "员工体验短视频与打卡"]),
        ("持续运营", "内容资产", ["每周一题营养科普", "月度体脂 / 活力主题报告", "跳绳榜 × 健康餐榜", "授权案例页 + 园区复制参访"]),
    ]
    for i,(phase,label,items) in enumerate(phases):
        x=0.62+i*4.18
        m.add_card(s,x,1.62,3.78,3.92,fill=m.CARD,line=m.ORANGE if i==0 else m.CYAN,radius=True,width=1.2)
        m.add_text(s,f"0{i+1}",x+0.22,1.84,0.46,0.32,size=13,color=m.ORANGE,bold=True)
        m.add_text(s,phase,x+0.62,1.75,2.78,0.52,size=21,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
        m.add_pill(s,label,x+1.02,2.40,1.74,fill=m.ORANGE if i==0 else m.BLUE,size=10.4)
        for j,item in enumerate(items):
            y=3.12+j*0.52
            m.add_circle(s,x+0.28,y+0.05,0.18,fill=m.GREEN,line=m.GREEN,width=0.4)
            m.add_text(s,item,x+0.60,y,2.88,0.40,size=11.2,color=m.SOFT,bold=j==0)
    m.add_card(s,0.62,5.78,12.14,0.54,fill=m.CARD_2,line=m.CYAN,radius=True,width=0.9)
    m.add_text(s,"园区内：企业微信 / 电梯屏 / 食堂屏 / 活动群",0.83,5.82,5.73,0.44,size=13.3,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
    m.add_text(s,"抖音外部：短视频 / 直播 / 案例切片 / 私信『园区』",6.62,5.82,5.90,0.44,size=13.3,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
    m.add_text(s,"传播不是办一场活动，而是把一次体验变成可持续的内容、数据和商机。",0.92,6.55,11.48,0.42,size=17.2,color=m.CYAN,bold=True,align=PP_ALIGN.CENTER)

    # 09 competitors
    s = new_slide(); m.add_title(s, 9, "竞品对比：雄伟科技、南京小牛、满客宝", "企业园区公开资料口径")
    headers=[("对手",0.60,1.74),("公开优势",2.42,3.02),("相对短板",5.52,3.02),("康比特赢点",8.62,4.08)]
    for label,x,w in headers:
        m.add_card(s,x,1.44,w,0.48,fill=m.ORANGE if label=="康比特赢点" else m.CARD_2,line=m.CYAN,radius=False,width=0.8)
        m.add_text(s,label,x,1.44,w,0.48,size=12.5,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
    rows=[
        ("雄伟科技","整体营建、全场景\n软硬件集成与交付","公开品牌核心更偏\n智慧食堂整体营建","运动营养品牌\n+ AI 健康运营"),
        ("南京小牛","RFID / AI 结算\n智能硬件、供应链、食安","公开认知更偏\n技术、终端与食堂数字化","5+2 产品组合\n+ 组织健康价值"),
        ("满客宝","SaaS / 云平台\n预订、餐补、集团管控","能力范围广，易进入\n通用功能同质化比较","复杂园区策略\n+ 系统连接 + AI 营养")]
    for i,row in enumerate(rows):
        y=2.04+i*1.26
        for text_value,x,w,color,bold in [
            (row[0],0.60,1.74,m.WHITE,True),(row[1],2.42,3.02,m.SOFT,False),
            (row[2],5.52,3.02,m.SOFT,False),(row[3],8.62,4.08,m.CYAN,True)]:
            m.add_card(s,x,y,w,1.08,fill=m.CARD,line=m.ORANGE if x==8.62 else m.CYAN,radius=False,width=0.65)
            m.add_text(s,text_value,x+0.08,y+0.05,w-0.16,0.98,size=11.7 if x!=0.60 else 13.5,color=color,bold=bold,align=PP_ALIGN.CENTER)
    m.add_card(s,0.60,5.98,12.10,0.63,fill=m.CARD_2,line=m.ORANGE,radius=True,width=1.0)
    m.add_text(s,"竞争结论：不与对手比功能数量，用“运动营养 + 园区运营 + AI”建立唯一认知。",0.82,6.03,11.66,0.53,size=16.5,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
    m.add_text(s,"相对短板为公开定位比较，不代表对方不具备相关能力。来源：sovell.com / xnzn.net / mankebao.com",0.86,6.80,11.62,0.24,size=8.2,color=m.MUTED,align=PP_ALIGN.CENTER)

    # 10 cases
    s = new_slide(); m.add_title(s, 10, "企业园区标杆：金斯瑞 × 江苏国信", "28 项目 3D 场景资产精选")
    m.add_image_cover(s,m.ATLAS / "P019-金斯瑞.png",0.60,1.48,5.95,3.35,frame=True)
    m.add_image_cover(s,m.ATLAS / "P010-江苏国信.png",6.78,1.48,5.95,3.35,frame=True)
    m.add_text(s,"金斯瑞：企业前厅完整链路",0.80,5.02,5.55,0.42,size=18,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
    m.add_text(s,"江苏国信：多策略、接口与前后厅协同",6.98,5.02,5.55,0.42,size=18,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
    m.add_pill(s,"线上订餐与取餐",1.03,5.70,1.82,fill=m.BLUE,size=10.2)
    m.add_pill(s,"后厨出品与运营",3.08,5.70,1.82,fill=m.BLUE,size=10.2)
    m.add_pill(s,"本人 / 亲友 / 招待",7.22,5.70,1.82,fill=m.ORANGE,size=10.2)
    m.add_pill(s,"一卡通 / 财务 / 国产化",9.27,5.70,2.28,fill=m.BLUE,size=10.2)
    m.add_text(s,"企业园区不是概念，是康比特已经具备项目表达和复制基础的主场景。",0.95,6.42,11.42,0.48,size=17.5,color=m.CYAN,bold=True,align=PP_ALIGN.CENTER)

    # 11 growth funnel
    s = new_slide(); m.add_title(s, 11, "增长力：抖音先拿线索，再把线索推进到方案会", "线索获取 → 商机转化 → 订单成交 → 客户复购")
    steps=[
        ("短视频", "高峰、规则、对账、食安、营养"),
        ("私信园区", "领取数字体检表"),
        ("30分钟诊断", "人数、班次、账户、系统、目标"),
        ("场景方案", "5+2 + 软硬件 + 实施"),
        ("订单与复购", "试点、成交、月报、扩容、转介绍")]
    for i,(title,body) in enumerate(steps):
        x=0.48+i*2.56
        m.add_card(s,x,2.18,2.18,3.12,fill=m.CARD,line=m.ORANGE if i in [0,4] else m.CYAN,radius=True,width=1.2)
        m.add_text(s,f"0{i+1}",x+0.18,2.39,0.48,0.32,size=13,color=m.ORANGE,bold=True)
        m.add_text(s,title,x+0.15,2.92,1.88,0.52,size=18,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
        m.add_text(s,body,x+0.18,3.70,1.82,1.12,size=11.5,color=m.SOFT,align=PP_ALIGN.CENTER)
        if i<4:m.add_line(s,x+2.20,3.72,x+2.52,3.72,color=m.GREEN,width=2.2)
    m.add_text(s,"抖音不替代销售，而是把陌生流量变成有问题、有角色、有下一步的真实商机。",0.90,5.85,11.52,0.55,size=19,color=m.CYAN,bold=True,align=PP_ALIGN.CENTER)

    # 12 content pillars
    s = new_slide(); m.add_title(s, 12, "五类内容，持续输出五力价值", "抖音内容矩阵")
    content=[
        ("品牌力", "专业观点", "国家队营养经验\n园区健康一餐"),
        ("场景力", "问题现场", "饭点卡顿\n多账户与对账"),
        ("产品力", "5+2 证据", "真实设备\n真实功能演示"),
        ("数据力", "健康服务点", "体脂、跳绳、营养师\n与用餐数据联动"),
        ("增长力", "客户见证", "3D 场景\n方案诊断与复盘")]
    for i,(force,topic,body) in enumerate(content):
        x=0.55+i*2.52
        m.add_card(s,x,1.82,2.26,3.95,fill=m.CARD,line=m.ORANGE if i==0 else m.CYAN,radius=True,width=1.2)
        m.add_text(s,force,x+0.16,2.05,1.94,0.48,size=20,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
        m.add_pill(s,topic,x+0.38,2.82,1.50,fill=m.ORANGE if i==0 else m.BLUE,size=10.5)
        m.add_text(s,body,x+0.20,3.65,1.86,1.12,size=12.5,color=m.SOFT,align=PP_ALIGN.CENTER)
    m.add_text(s,"每条视频只讲一个问题、一个结论、一个证据、一个行动入口。",0.98,6.18,11.36,0.52,size=20,color=m.CYAN,bold=True,align=PP_ALIGN.CENTER)

    # 13 CTA
    s = new_slide()
    m.add_pill(s,"KANGBITE · ENTERPRISE PARK",0.80,0.72,3.05,fill=m.ORANGE,size=11)
    m.add_text(s,"一个园区，\n一套健康团餐运营底座。",1.05,1.62,8.95,1.75,size=38,color=m.WHITE,bold=True)
    m.add_text(s,"用品牌建立信任，用场景形成共鸣，用产品证明能力，\n用数据持续增值，用增长推动成交。",1.08,3.78,8.78,1.02,size=20,color=m.SOFT,valign=MSO_ANCHOR.TOP)
    m.add_card(s,1.08,5.10,7.92,1.02,fill=m.CARD_2,line=m.ORANGE,radius=True,width=1.4)
    m.add_text(s,"私信「园区」，预约 30 分钟园区食堂数字体检",1.28,5.20,7.52,0.78,size=22,color=m.WHITE,bold=True,align=PP_ALIGN.CENTER)
    m.add_circle(s,10.12,2.16,1.70,fill=m.CARD_2,line=m.CYAN,width=1.8)
    m.add_text(s,"AI\n营养",10.12,2.16,1.70,1.70,size=23,color=m.CYAN,bold=True,align=PP_ALIGN.CENTER)
    m.add_text(s,"THANK YOU",9.86,6.25,2.55,0.46,size=20,color=m.CYAN,bold=True,align=PP_ALIGN.CENTER)
    m.add_text(s,"KANGBITE  ·  PARK SMART CANTEEN  ·  13",9.05,7.08,3.70,0.20,size=8.5,color=m.MUTED,align=PP_ALIGN.RIGHT)

    # Appendix: all original capability images remain available without occupying the five-minute route.
    appendix=[
        (14,"备查｜产品能力全景",m.INFOGRAPHIC / "outputs/local/06-capability-panorama.png"),
        (15,"备查｜高峰与弱网",m.INFOGRAPHIC / "outputs/local/01-peak-and-offline.png"),
        (16,"备查｜信创适配",m.INFOGRAPHIC / "outputs/local/02-domestic-platforms.png"),
        (17,"备查｜消费策略与账户结算",m.INFOGRAPHIC / "outputs/local/03-consumption-policy-account-settlement.png"),
        (18,"备查｜系统连接",m.INFOGRAPHIC / "outputs/local/04-system-connections-hd.png"),
        (19,"备查｜全场景设备生态",m.INFOGRAPHIC / "outputs/local/05-hardware-ecosystem-hd.png"),
        (20,"备查｜AI 运动营养师 Agent",m.INFOGRAPHIC / "outputs/v2/01-ai-nutrition-capability.png"),
        (21,"备查｜数字技术能力",m.INFOGRAPHIC / "outputs/v2/02-digital-technology-capability-wysiwyg.png")]
    for n,title,path in appendix:
        s=new_slide();m.add_title(s,n,title,"5 分钟主讲结束后的备查材料")
        m.add_full_image(s,path,x=1.88,y=1.31,h=5.70,frame=True)

    for sld_id in list(prs.slides._sldIdLst)[:original_slide_count]:
        prs.part.drop_rel(sld_id.rId)
        prs.slides._sldIdLst.remove(sld_id)

    prs.core_properties.title="康比特企业园区智慧食堂五力路演方案（5分钟健康服务点版）"
    prs.core_properties.subject="企业园区；SOM；园区健康服务点；体脂秤；智能跳绳；AI营养师；五力；5+2；抖音增长"
    prs.core_properties.author="康比特数字体育科技"
    prs.core_properties.keywords="企业园区智慧食堂,SOM,园区健康服务点,体脂秤,智能跳绳,AI营养师,雄伟科技,南京小牛,满客宝,5+2,抖音"
    prs.save(str(OUTPUT))
    shutil.copy2(OUTPUT,DESKTOP)
    print(OUTPUT)
    print(DESKTOP)
    print(f"slides={len(prs.slides)} main=13 appendix=8")


if __name__ == "__main__":
    build()
