#!/usr/bin/env python3
from __future__ import annotations

import importlib.util
from pathlib import Path
import shutil

from pptx import Presentation
from pptx.enum.text import 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)

SOURCE = Path("/Users/jack/Library/Containers/com.tencent.WeWorkMac/Data/Documents/Profiles/A74DF84611CC2ED79C4C206E40B5D80E/Caches/Files/2026-08/c96be377e24ccd220df1aee843fd7bcf/康比特企业园区智慧食堂五力路演方案_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"
BUILD = m.WORK / "build/park-five-force-final-12"
OUTPUT = BUILD / "康比特企业园区智慧食堂五力路演方案_12页5分钟终稿_20260815.pptx"
DESKTOP = Path("/Users/jack/Desktop/智慧食堂抖音价值营销方案_20260814/01-最终交付/康比特企业园区智慧食堂五力路演方案_12页5分钟终稿_20260815.pptx")


def clear_content_keep_template(slide, keep_shapes: int = 52):
    for shape in list(slide.shapes)[keep_shapes:]:
        element = shape._element
        element.getparent().remove(element)


def trim_to_twelve(prs):
    while len(prs.slides) > 12:
        sld_id = prs.slides._sldIdLst[-1]
        prs.part.drop_rel(sld_id.rId)
        prs.slides._sldIdLst.remove(sld_id)


def add_health_point(slide):
    clear_content_keep_template(slide)
    m.add_title(slide, 7, "园区健康服务点解决方案", "落位：箭头所指核心动线节点")
    m.add_card(slide, 0.58, 1.37, 3.38, 4.86, fill=m.WHITE, line=m.CYAN, radius=False, width=1.0)
    slide.shapes.add_picture(str(LOCATION_MAP), m.I(0.67), m.I(1.46), width=m.I(3.20))
    m.add_pill(slide, "园区健康服务点", 1.05, 5.72, 2.42, fill=m.ORANGE, size=11.0)
    m.add_image_cover(slide, HEALTH_POINT_3D, 4.18, 1.43, 8.42, 3.52, frame=True)
    m.add_pill(slide, "方案效果图", 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(slide, 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(slide, num, x + 0.13, 5.35, 0.36, 0.28, size=11, color=m.ORANGE, bold=True)
        m.add_text(slide, title, x + 0.52, 5.29, 1.82, 0.34, size=15, color=m.WHITE, bold=True, align=PP_ALIGN.CENTER)
        m.add_text(slide, body, x + 0.16, 5.70, 2.26, 0.54, size=9.8, color=m.SOFT, align=PP_ALIGN.CENTER)
    m.add_text(slide, "测得准 · 动起来 · 吃得对：三类服务共用一个健康账户，并与食堂用餐数据持续联动。", 3.98, 6.53, 8.78, 0.42, size=15.8, color=m.CYAN, bold=True, align=PP_ALIGN.CENTER)


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


def update_positioning_text(prs):
    for shape in prs.slides[4].shapes:
        if not hasattr(shape, "text"):
            continue
        if "AI 营养 + 餐前餐中餐后" in shape.text:
            shape.text_frame.paragraphs[0].runs[0].text = "体脂秤 + 智能跳绳 + AI 营养师\n形成健康闭环"
            for paragraph in shape.text_frame.paragraphs:
                paragraph.alignment = PP_ALIGN.CENTER
                for run in paragraph.runs:
                    run.font.name = m.FONT
                    run.font.size = m.Pt(11)
                    run.font.color.rgb = m.SOFT
        if "抖音线索 + 数字体检" in shape.text:
            shape.text_frame.paragraphs[0].runs[0].text = "GEO 线索 + 数字体检\n形成商机与订单"
    for shape in prs.slides[11].shapes:
        if not hasattr(shape, "text"):
            continue
        if shape.text.strip().startswith("私信「园区」"):
            shape.text_frame.paragraphs[0].runs[0].text = "搜索「康比特园区智慧食堂」，预约 30 分钟数字体检"


def build():
    for required in [SOURCE, LOCATION_MAP, HEALTH_POINT_3D]:
        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(SOURCE))
    if len(prs.slides) < 12:
        raise RuntimeError(f"source deck requires at least 12 slides, found {len(prs.slides)}")
    trim_to_twelve(prs)
    add_health_point(prs.slides[6])
    add_communication_plan(prs.slides[10])
    update_positioning_text(prs)

    prs.core_properties.title = "康比特企业园区智慧食堂五力路演方案（12页5分钟终稿）"
    prs.core_properties.subject = "企业园区；SOM；5+2；园区健康服务点；传播方案；竞品；案例；GEO"
    prs.core_properties.author = "康比特数字体育科技"
    prs.core_properties.keywords = "企业园区智慧食堂,SOM,5+2,体脂秤,智能跳绳,AI营养师,传播方案,GEO,雄伟科技,南京小牛,满客宝"
    prs.save(str(OUTPUT))
    shutil.copy2(OUTPUT, DESKTOP)
    print(OUTPUT)
    print(DESKTOP)
    print(f"slides={len(prs.slides)} total=12 duration=5min appendix=0")


if __name__ == "__main__":
    build()
