#!/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)  # 深灰色
LIGHT_COLOR = RgbColor(245, 245, 245)  # 浅灰背景

def add_title_slide(prs, 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))
    tf = sub_box.text_frame
    p = tf.paragraphs[0]
    p.text = subtitle
    p.font.size = Pt(24)
    p.font.color.rgb = RgbColor(200, 200, 200)
    p.alignment = PP_ALIGN.CENTER
    
    return slide

def add_content_slide(prs, title, bullets=None, content=None):
    \\"\\"\\"添加内容页\\"\\"\\"
    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.4), Inches(12.333), Inches(5.8))
    tf = content_box.text_frame
    tf.word_wrap = True
    
    if bullets:
        for i, bullet in enumerate(bullets):
            if i == 0:
                p = tf.paragraphs[0]
            else:
                p = tf.add_paragraph()
            p.text = \\"• \\" + bullet
            p.font.size = Pt(20)
            p.font.color.rgb = TEXT_COLOR
            p.space_after = Pt(10)
    
    if content:
        p = tf.paragraphs[0]
        p.text = content
        p.font.size = Pt(18)
        p.font.color.rgb = TEXT_COLOR
    
    return slide

def add_two_column_slide(prs, 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
        p.font.size = Pt(18)
        p.font.color.rgb = TEXT_COLOR
        p.space_after = Pt(8)
    
    # 右侧标题
    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
        p.font.size = Pt(18)
        p.font.color.rgb = TEXT_COLOR
        p.space_after = Pt(8)
    
    return slide

# ========== 开始创建PPT ==========

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

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

# ========== 第一课时 ==========

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

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

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

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

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

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

# 讨论题
add_content_slide(prs, \\"讨论：一线城市还是回乡建设？\\", [
    \\"一线城市：更多机会、更大平台、竞争激烈\\",
    \\"\\",
    \\"回乡建设：\\",
    \\"  • 家乡发展潜力\\",
    \\"  • 生活成本优势\\",
    \\"  • 乡村振兴机遇\\",
    \\"\\",
    \\"优秀校友案例分享\\",
    \\"  • 基层或艰苦行业奋斗故事\\"
])

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

# ========== 第二课时 ==========

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

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

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

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

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

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

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

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

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

# 保存文件
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)}\\")
