#!/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)}")
