#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE
import os

# 创建演示文稿
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)

# 定义颜色方案
TITLE_COLOR = RGBColor(0, 51, 102)  # 深蓝色
ACCENT_COLOR = RGBColor(0, 112, 192)  # 亮蓝色
TEXT_COLOR = RGBColor(33, 33, 33)  # 深灰色

def add_title_slide(title, subtitle):
    slide_layout = prs.slide_layouts[6]
    slide = prs.slides.add_slide(slide_layout)
    
    # 背景
    shape = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height)
    shape.fill.solid()
    shape.fill.fore_color.rgb = RGBColor(0, 51, 102)
    shape.line.fill.background()
    
    # 主标题
    title_box = slide.shapes.add_textbox(Inches(0.5), Inches(2.5), Inches(12.333), Inches(1.5))
    tf = title_box.text_frame
    p = tf.paragraphs[0]
    p.text = title
    p.font.size = Pt(44)
    p.font.bold = True
    p.font.color.rgb = RGBColor(255, 255, 255)
    p.alignment = PP_ALIGN.CENTER
    
    # 副标题
    sub_box = slide.shapes.add_textbox(Inches(0.5), Inches(4.2), Inches(12.333), Inches(1.2))
    tf = sub_box.text_frame
    tf.word_wrap = True
    for i, line in enumerate(subtitle.split('\n')):
        if i == 0:
            p = tf.paragraphs[0]
        else:
            p = tf.add_paragraph()
        p.text = line
        p.font.size = Pt(24)
        p.font.color.rgb = RGBColor(200, 200, 200)
        p.alignment = PP_ALIGN.CENTER
    
    return slide

def add_content_slide(title, bullets):
    slide_layout = prs.slide_layouts[6]
    slide = prs.slides.add_slide(slide_layout)
    
    # 标题栏背景
    header = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(1.2))
    header.fill.solid()
    header.fill.fore_color.rgb = ACCENT_COLOR
    header.line.fill.background()
    
    # 标题
    title_box = slide.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(12.333), Inches(0.7))
    tf = title_box.text_frame
    p = tf.paragraphs[0]
    p.text = title
    p.font.size = Pt(32)
    p.font.bold = True
    p.font.color.rgb = RGBColor(255, 255, 255)
    
    # 内容
    content_box = slide.shapes.add_textbox(Inches(0.5), Inches(1.5), Inches(12.333), Inches(5.5))
    tf = content_box.text_frame
    tf.word_wrap = True
    
    for i, bullet in enumerate(bullets):
        if i == 0:
            p = tf.paragraphs[0]
        else:
            p = tf.add_paragraph()
        
        if bullet.strip():
            p.text = "● " + bullet
        else:
            p.text = ""
        p.font.size = Pt(20)
        p.font.color.rgb = TEXT_COLOR
        p.space_after = Pt(8)
    
    return slide

def add_two_column_slide(title, left_title, left_bullets, right_title, right_bullets):
    slide_layout = prs.slide_layouts[6]
    slide = prs.slides.add_slide(slide_layout)
    
    # 标题栏
    header = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(1.1))
    header.fill.solid()
    header.fill.fore_color.rgb = ACCENT_COLOR
    header.line.fill.background()
    
    title_box = slide.shapes.add_textbox(Inches(0.5), Inches(0.25), Inches(12.333), Inches(0.6))
    tf = title_box.text_frame
    p = tf.paragraphs[0]
    p.text = title
    p.font.size = Pt(32)
    p.font.bold = True
    p.font.color.rgb = RGBColor(255, 255, 255)
    
    # 左侧标题
    left_title_box = slide.shapes.add_textbox(Inches(0.5), Inches(1.3), Inches(6), Inches(0.5))
    tf = left_title_box.text_frame
    p = tf.paragraphs[0]
    p.text = left_title
    p.font.size = Pt(24)
    p.font.bold = True
    p.font.color.rgb = TITLE_COLOR
    
    # 左侧内容
    left_box = slide.shapes.add_textbox(Inches(0.5), Inches(1.9), Inches(6), Inches(5))
    tf = left_box.text_frame
    tf.word_wrap = True
    for i, bullet in enumerate(left_bullets):
        if i == 0:
            p = tf.paragraphs[0]
        else:
            p = tf.add_paragraph()
        p.text = "● " + bullet if bullet.strip() else ""
        p.font.size = Pt(18)
        p.font.color.rgb = TEXT_COLOR
        p.space_after = Pt(6)
    
    # 右侧标题
    right_title_box = slide.shapes.add_textbox(Inches(6.8), Inches(1.3), Inches(6), Inches(0.5))
    tf = right_title_box.text_frame
    p = tf.paragraphs[0]
    p.text = right_title
    p.font.size = Pt(24)
    p.font.bold = True
    p.font.color.rgb = TITLE_COLOR
    
    # 右侧内容
    right_box = slide.shapes.add_textbox(Inches(6.8), Inches(1.9), Inches(6), Inches(5))
    tf = right_box.text_frame
    tf.word_wrap = True
    for i, bullet in enumerate(right_bullets):
        if i == 0:
            p = tf.paragraphs[0]
        else:
            p = tf.add_paragraph()
        p.text = "● " + bullet if bullet.strip() else ""
        p.font.size = Pt(18)
        p.font.color.rgb = TEXT_COLOR
        p.space_after = Pt(6)
    
    return slide

# ========== 创建PPT ==========

# 1. 封面
add_title_slide("从容启航·安全着陆", "大学生就业心理、安全与思想教育\n2课时（90分钟）")

# 2. 目录
add_content_slide("课程目录", [
    "第一课时：阳光心态与思想领航（45分钟）",
    "  - 就业心理解码：焦虑从何而来",
    "  - 心理调适工具箱：做自己的心理教练",
    "  - 就业思想教育：树立正确的职业观",
    "",
    "第二课时：就业安全与权益保护（45分钟）",
    "  - 就业陷阱大起底",
    "  - 法律武器：我的权益我做主",
    "  - 安全应对策略"
])

# 3. 第一课时封面
add_title_slide("第一课时", "阳光心态与思想领航\n45分钟")

# 4. 导入
add_content_slide("导入：就业心闻播报", [
    "近两年慢就业、缓就业现象分析",
    "就业焦虑症数据与典型案例",
    "",
    "思考题：你现在的就业状态是？",
    "  A. 胸有成竹  B. 茫然跟随  C. 焦虑逃避"
])

# 5. 核心讲授一
add_content_slide("核心讲授一：就业心理解码", [
    "常见心理误区",
    "  ● 攀比心理 - 与同学比较岗位和薪资",
    "  ● 依赖心理 - 依赖父母安排或等待机会",
    "  ● 自卑心理 - 对自身能力缺乏信心",
    "  ● 急功近利 - 追求快速成功而忽视积累",
    "",
    "压力源分析",
    "  ● 社会期待与家庭期望",
    "  ● 同辈压力（同学比较）",
    "  ● 自我认知不清，定位模糊"
])

# 6. 核心讲授二（双栏）
add_two_column_slide(
    "核心讲授二：心理调适工具箱",
    "认知调整 - 能力三核模型",
    [
        "知识：专业背景、理论知识",
        "技能：可迁移的能力",
        "才干：个人特质和天赋",
        "",
        "重新审视自身优势",
        "发现被忽视的能力"
    ],
    "行动策略 - SMART原则",
    [
        "S - Specific 具体明确",
        "M - Measurable 可衡量",
        "A - Achievable 可实现",
        "R - Relevant 相关性",
        "T - Time-bound 有时限",
        "",
        "例：每周投递X份简历"
    ]
)

# 7. 情绪释放
add_content_slide("心理调适：情绪释放与方法", [
    "呼吸放松法",
    "  ● 4-7-8 呼吸节奏练习",
    "",
    "运动减压",
    "  ● 规律运动释放压力",
    "",
    "学校资源",
    "  ● 心理咨询中心",
    "",
    "决策平衡单",
    "  ● 理性选择offer的科学方法"
])

# 8. 核心讲授三
add_content_slide("核心讲授三：就业思想教育", [
    "形势认知",
    "  ● 产业结构调整与就业市场变化",
    "  ● AI对传统岗位的影响",
    "",
    "价值观引导",
    "  ● 弘扬工匠精神",
    "  ● 基层就业：选调生、西部计划",
    "  ● 正确处理个人理想与国家需要",
    "",
    "诚信教育",
    "  ● 简历不造假、签约不违约"
])

# 9. 讨论
add_content_slide("讨论：一线城市还是回乡建设？", [
    "一线城市",
    "  ● 更多机会、更大平台",
    "  ● 竞争激烈、生活成本高",
    "",
    "回乡建设",
    "  ● 家乡发展潜力",
    "  ● 生活成本优势",
    "  ● 乡村振兴机遇",
    "",
    "优秀校友案例分享"
])

# 10. 第一课时小结
add_content_slide("第一课时小结", [
    "核心要点",
    "  ● 常见就业心理误区及调适方法",
    "  ● 能力三核模型与SMART原则",
    "  ● 先就业后择业的理性观念",
    "",
    "课后思考：撰写《我的职业优势清单》",
    "",
    "金句：心态决定状态，眼界决定境界"
])

# 11. 第二课时封面
add_title_slide("第二课时", "就业安全与权益保护\n45分钟")

# 12. 导入
add_content_slide("情景剧导入：求职路上的坑", [
    "案例一：高薪诱惑骗取培训费",
    "案例二：口头承诺不兑现",
    "案例三：黑中介扣押证件",
    "",
    "思考：",
    "  ● 如果是你，会中招吗？",
    "  ● 哪个环节出了问题？"
])

# 13. 核心讲授一
add_content_slide("核心讲授一：就业陷阱大起底", [
    "黑中介与假招聘",
    "  ● 特征：收费后无限拖延",
    "",
    "传销陷阱",
    "  ● 特征：拉人头、发展下线、限制人身自由",
    "",
    "试用期滥用",
    "  ● 单独签试用期合同",
    "  ● 试用期超过6个月、不交社保",
    "",
    "合同猫腻",
    "  ● 口头合同、阴阳合同、霸王条款"
])

# 14. 核心讲授二（双栏）
add_two_column_slide(
    "核心讲授二：法律武器",
    "关键文书辨析",
    [
        "《就业协议书》（三方协议）",
        "法律性质与违约责任",
        "",
        "《劳动合同》必备条款",
        "薪酬待遇、工作时间",
        "社会保险、休息休假"
    ],
    "避坑实操指南",
    [
        "签约前必查",
        "国家企业信用信息公示系统",
        "",
        "五险一金缴费基数",
        "",
        "维权路径",
        "劳动监察投诉：12333",
        "申请劳动仲裁"
    ]
)

# 15. 劳动合同审核要点
add_content_slide("劳动合同审核要点", [
    "必须关注的条款：",
    "  1. 违约金条款 - 是否有不合理约定",
    "  2. 工作地点 - 是否与承诺一致",
    "  3. 薪酬构成 - 基本工资vs绩效",
    "  4. 社保缴纳 - 何时开始缴纳",
    "  5. 解除条件 - 提前解约的条件",
    "",
    "避坑提醒：",
    "  ● 不签生死状、不签空白合同",
    "  ● 保留合同副本"
])

# 16. 核心讲授三
add_content_slide("核心讲授三：安全应对策略", [
    "信息安全",
    "  ● 简历脱敏处理",
    "  ● 身份证号、家庭住址保护",
    "",
    "人身安全",
    "  ● 面试地点偏僻时的应对",
    "  ● 告知亲友、保持通话",
    "",
    "社交安全",
    "  ● 面对隐私提问的应对",
    "  ● 礼貌而坚定地拒绝"
])

# 17. 角色扮演
add_content_slide("角色扮演：应对面试官", [
    "场景练习：",
    "  ● 面试官提出隐私问题",
    "  ● 面试官要求提供额外费用",
    "  ● 面试官承诺与合同不符",
    "",
    "两人一组练习",
    "  ● 练习拒绝话术",
    "  ● 掌握应对技巧"
])

# 18. 总结与资源
add_content_slide("总结与资源推介", [
    "核心要点回顾",
    "  ● 识别各类就业陷阱",
    "  ● 掌握劳动合同审核要点",
    "  ● 学会保护自身安全",
    "",
    "推介资源",
    "  ● 学校就业指导中心",
    "  ● 教育部24365平台",
    "",
    "咨询热线：法律援助热线"
])

# 19. 结束页
add_title_slide("祝大家前程似锦", "不仅拿到offer，更能平安、自信地\n走好职场第一步！")

# 保存
output_path = "/root/.openclaw/workspace/大学生就业指导课件.pptx"
prs.save(output_path)
print(f"PPT已保存: {output_path}")
print(f"文件大小: {os.path.getsize(output_path) / 1024:.1f} KB")
print(f"总页数: {len(prs.slides)}")
