# -*- coding: utf-8 -*-
"""小班成长日志批量生成器。
依据《3-6岁儿童学习与发展指南》与小班健康课程全年分周主题(教材/幼儿园/小班/健康/小班健康.md)。
一天一个文件，落在 教材/幼儿园/小班/成长日志/，保留已有手工样本。
"""
import os
from datetime import date, timedelta
import random

BASE = os.path.dirname(os.path.abspath(__file__))
OUT = os.path.join(BASE, "教材", "幼儿园", "小班", "成长日志")
os.makedirs(OUT, exist_ok=True)
random.seed(20240902)

# ---------- 幼儿名册（22人，含已写样本小宇/朵朵/浩浩/欣欣）----------
CHILDREN = [
    ("小宇", "男", "3岁2个月"), ("朵朵", "女", "3岁4个月"), ("浩浩", "男", "3岁1个月"),
    ("欣欣", "女", "3岁3个月"), ("阳阳", "男", "3岁5个月"), ("妞妞", "女", "3岁2个月"),
    ("牛牛", "男", "3岁3个月"), ("贝贝", "女", "3岁1个月"), ("明明", "男", "3岁4个月"),
    ("乐乐", "男", "3岁2个月"), ("笑笑", "女", "3岁3个月"), ("果果", "女", "3岁5个月"),
    ("轩轩", "男", "3岁1个月"), ("丫丫", "女", "3岁2个月"), ("洋洋", "男", "3岁4个月"),
    ("恬恬", "女", "3岁3个月"), ("晨晨", "男", "3岁2个月"), ("可可", "女", "3岁4个月"),
    ("壮壮", "男", "3岁5个月"), ("囡囡", "女", "3岁1个月"), ("淘淘", "男", "3岁3个月"),
    ("安安", "女", "3岁2个月"),
]

# ---------- 40周主题（周一到周五），取自小班健康全年分周 ----------
WEEKS = {
 1: ["我会洗手——学习六步洗手法，儿歌《洗手歌》", "喝水小达人——口渴主动喝水，排队接水", "午睡乖乖——学习脱鞋、盖被、安静入睡", "我要上厕所——区分男女生厕所，便后冲水", "情绪抱抱——想妈妈时找老师抱抱，学习表达情绪"],
 2: ["我会坐好——吃饭坐定，一手扶碗一手拿勺", "不挑食——认识青菜、肉、米饭，尝试都吃一点", "细嚼慢咽——一口饭一口菜，不奔跑吃饭", "饭后擦嘴——擦嘴、漱口、放碗筷", "文明进餐——不大声说话，不剩饭"],
 3: ["认识红绿灯——红灯停、绿灯行、黄灯等一等", "过马路走斑马线——牵着大人手，左右看", "不在马路上跑——马路危险，不能乱跑", "认识交通标志——注意行人、禁止通行等", "我是小司机——骑小车游戏，遵守规则"],
 4: ["认识五官——眼睛、鼻子、耳朵、嘴巴、眉毛", "保护眼睛——不揉眼睛，少看电视", "保护牙齿——早晚刷牙，少吃糖", "我的小手——会洗手、会收拾玩具", "我的小脚——走路稳，不摔跤"],
 5: ["走走跑跑——听信号走、跑、停", "钻山洞——弯腰钻过拱门，不碰头", "跳一跳——双脚原地跳，轻轻落地", "投掷小球——向前投掷，对准目标", "爬爬乐——手脚协调爬过垫子"],
 6: ["爱吃蔬菜——青菜、胡萝卜、黄瓜都要吃", "水果真好吃——苹果、香蕉、梨，每天一种", "多喝白开水——少喝饮料，多喝温水", "少吃零食——饭前不吃零食", "营养小餐盘——认识主食、菜、肉、水果"],
 7: ["不跟陌生人走——陌生人给糖不能要", "记住家长电话——知道爸爸妈妈名字", "找不到大人怎么办——找警察或工作人员", "安全上下楼梯——扶栏杆，不推挤", "尖尖的东西不能碰——剪刀、铅笔尖要小心"],
 8: ["平衡木——张开手臂慢慢走", "拍球游戏——学习拍球一下、两下", "绕障碍跑——绕过小桶不碰到", "合作游戏——两人拉小车", "体育小达人——展示本周学到的动作"],
 9: ["自己吃饭——不用大人喂，独立进餐", "饭后漱口——漱口三遍，保护牙齿", "吃饭不说话——嘴里有饭不说话", "不剩饭——吃多少盛多少", "整理餐桌——把碗放进水池"],
 10: ["勤剪指甲——指甲长了要剪", "擦鼻涕——用纸巾，擦完扔垃圾桶", "咳嗽捂住嘴——不对着人咳嗽", "勤换衣服——衣服脏了换下来", "每天洗脸——早上洗脸，保持干净"],
 11: ["天冷加衣——根据天气穿脱衣服", "运动出汗——出汗后擦汗、喝水", "开窗通风——家里和教室要开窗", "生病要休息——不舒服告诉老师", "勤洗手防病菌——饭前便后、回家后都洗手"],
 12: ["滑滑梯要排队——不推不挤，轮流玩", "秋千轻轻荡——抓紧绳子，不乱踢", "不爬高处——不爬窗、不爬桌子", "玩具不乱扔——收拾玩具，不绊倒", "户外安全我知道——总结安全规则"],
 13: ["认识冬装——棉衣、帽子、手套、围巾", "我会穿衣——先穿袖子，再扣扣子", "穿脱外套——学会自己穿脱外套", "鞋子穿对——左右脚分清，不踩鞋跟", "整理衣物——把帽子手套放固定位置"],
 14: ["晨练不怕冷——早上出来做操", "跑步热身——运动前先跑一跑", "跳绳准备——学习握绳，摇绳", "拍球游戏——巩固拍球", "冬季运动会——小组接力赛"],
 15: ["多喝温水——冬天也要多喝水", "出门戴口罩——雾霾天戴口罩", "不用手揉眼睛——手上细菌多", "室内安全——远离暖气、热水袋", "健康生活我知道——总结冬季健康习惯"],
 16: ["过节也要早睡——不熬夜，按时睡", "少吃糖果——保护牙齿", "安全装饰教室——不碰尖尖物品", "我会排队——表演节目排队上场", "元旦联欢——唱歌跳舞，开心过节"],
 17: ["不玩火——火柴、打火机不能玩", "不碰插座——电很危险", "热水要小心——烫的东西不能碰", "不乱吃药——药品不是糖", "不给陌生人开门——在家大人才能开门"],
 18: ["牵着大人的手——出门不松手", "不在马路上跑——马路上车多", "认识安全出口——商场里找绿色标志", "走丢怎么办——原地等或找工作人员", "我是安全小卫士——复习安全知识"],
 19: ["春节也要按时吃饭——不暴饮暴食", "少吃糖果和零食——保护牙齿", "按时睡觉——不熬夜看烟花", "走亲访友讲礼貌——叫人、不挑食", "假期安全——过年不玩鞭炮"],
 20: ["拜年礼仪——学说新年好、恭喜发财", "分享春节趣事——用三句话讲过年", "情绪安定——回到幼儿园不哭", "作息调整——早睡早起，不赖床", "春季健康——脱衣服要适当"],
 21: ["小兔跳跳——学小兔双脚跳", "小鸭走路——摇摇摆摆走", "小马跑——跑得快又稳", "小乌龟爬——手脚爬地", "动物运动会——模仿动物动作比赛"],
 22: ["我会拍球——学习拍一下接球", "连续拍球——尝试连续拍两下", "边走边拍——边走边拍球", "传球游戏——两人互相传球", "拍球小能手——展示"],
 23: ["跳过小河——跳过地上的线", "钻过山洞——钻拱形门", "平衡走——走平衡木", "投掷沙包——向前扔沙包", "综合运动——跑、跳、钻、投"],
 24: ["洗手再检查——六步洗手我会了", "饭后刷牙——学习正确刷牙", "整理小书包——把东西放好", "爱护环境——不乱扔垃圾", "卫生小标兵——总结"],
 25: ["我会刷牙——上下刷、左右刷", "洗脸的步骤——先擦眼睛，再擦脸", "洗头发——洗头不哭，闭眼睛", "洗脚——睡前洗脚，身体舒服", "洗澡安全——浴室地滑要小心"],
 26: ["玩具回家——玩完玩具收好", "衣服叠一叠——学习叠小衣服", "图书摆整齐——书脊朝外摆好", "鞋子摆好——鞋尖朝外放", "我会整理小柜——整理自己的柜子"],
 27: ["垃圾分类——认识可回收、厨余、其他垃圾", "节约用水——洗手关小水", "节约用电——离开关灯", "爱护花草——不摘花、不踩草", "环保小卫士——总结"],
 28: ["自己的事情自己做——穿衣、吃饭", "帮老师摆椅子——做班级小帮手", "帮妈妈递东西——做家里小帮手", "感谢劳动者——认识清洁工、医生、警察", "劳动节放假安全教育"],
 29: ["坐汽车系安全带——坐车要坐安全座椅", "走人行道——不在马路上走", "看交通标志——红灯停、绿灯行", "不在车边玩——停车场危险", "我是交通小警察——游戏"],
 30: ["连续拍球——尝试拍3-5下", "单脚站立——练平衡", "跨跳——跨过小河沟", "投掷准——把沙包投进筐", "运动展示——全班展示"],
 31: ["我会擦桌子——用小抹布擦桌子", "我会浇花——给植物浇水", "我会叠被子——学习叠小被子", "我会穿鞋子——分清左右", "劳动小能手——表扬"],
 32: ["排练节目——排队站好", "舞台安全——上下台小心", "化妆讲卫生——不揉眼睛", "多吃蔬菜——保持体力", "六一联欢——开心表演"],
 33: ["多喝水——天热多喝水", "防晒——出门戴帽子", "防蚊虫——穿长袖，喷防蚊液", "不在太阳下久玩——找阴凉处休息", "游泳安全——大人陪同才能下水"],
 34: ["少吃冷饮——冷饮吃多了肚子疼", "吃干净水果——水果要洗干净", "饭菜不隔夜——夏天饭菜容易坏", "多喝水不中暑——出汗多补水", "夏季饮食安全——总结"],
 35: ["早上运动——避开中午最热", "运动后休息——出汗了歇一歇", "穿透气衣服——穿棉质衣服", "午睡重要——夏天也要午睡", "健康生活过夏天——总结"],
 36: ["认识端午节——吃粽子、赛龙舟", "粽子不能多吃——糯米不好消化", "河边安全——看龙舟要跟大人", "挂艾草——认识艾草菖蒲", "端午节放假安全"],
 37: ["在家安全——不爬高、不玩火", "不给陌生人开门——不认识的人不开门", "出门找大人——去哪里告诉大人", "不吃陌生人东西——糖果饮料不要", "记住家庭地址——知道小区名、门牌号"],
 38: ["按时起床——不睡懒觉", "按时吃饭——三餐规律", "少看电视——每天不超过20分钟", "多喝水——夏天多喝水", "帮妈妈做小事——递东西、擦桌子"],
 39: ["开空调要适度——温度不要太低", "出汗换衣服——湿衣服换下来", "中午不出门——最热时在家休息", "吃西瓜适量——西瓜好吃不多吃", "夏季安全总结"],
 40: ["复习洗手——六步洗手", "复习吃饭——自己吃、不挑食", "复习安全——红灯停绿灯行", "复习运动——拍球、跳一跳", "我升中班啦——庆祝"],
}

# 每周首个工作日（周一），依教学日历并避开长假
WEEK_START = [
 date(2024,9,2), date(2024,9,9), date(2024,9,16), date(2024,9,23), date(2024,10,8),
 date(2024,10,14), date(2024,10,21), date(2024,10,28), date(2024,11,4), date(2024,11,11),
 date(2024,11,18), date(2024,11,25), date(2024,12,2), date(2024,12,9), date(2024,12,16),
 date(2024,12,23), date(2025,1,6), date(2025,1,13), date(2025,1,20), date(2025,2,24),
 date(2025,3,3), date(2025,3,10), date(2025,3,17), date(2025,3,24), date(2025,3,31),
 date(2025,4,7), date(2025,4,14), date(2025,4,21), date(2025,4,28), date(2025,5,6),
 date(2025,5,12), date(2025,5,19), date(2025,5,26), date(2025,6,2), date(2025,6,9),
 date(2025,6,16), date(2025,6,23), date(2025,6,30), date(2025,7,7), date(2025,7,14),
]

WEEKDAY_CN = ["星期一","星期二","星期三","星期四","星期五"]

def holiday_set():
    s = set()
    for d in [(2024,9,15),(2024,9,16),(2024,9,17)]: s.add(date(*d))          # 中秋
    for n in range(1,8): s.add(date(2024,10,n))                                # 国庆
    s.add(date(2025,1,1))                                                    # 元旦
    for n in range(20,31): s.add(date(2025,1,n))                             # 寒假1月
    for n in range(1,23): s.add(date(2025,2,n))                              # 寒假2月
    for d in [(2025,4,4),(2025,4,5),(2025,4,6)]: s.add(date(*d))            # 清明
    for n in range(1,6): s.add(date(2025,5,n))                               # 劳动
    for d in [(2025,5,31),(2025,6,1),(2025,6,2)]: s.add(date(*d))          # 端午
    return s

HOLIDAY = holiday_set()

WEATHER = {
 (9,10,11): ["晴","多云","阴","小雨"], (12,1,2): ["晴","多云","晴冷","小雪"],
 (3,4,5): ["晴","多云","小雨","阴"], (6,7): ["晴","多云","雷阵雨","炎热"],
}
def weather_of(m):
    for ks, v in WEATHER.items():
        if m in ks: return random.choice(v)
    return "晴"

def guess_domain(t):
    if any(k in t for k in ["故事","儿歌","说话","表达","礼貌用语","阅读","讲","叫人","拜年"]): return "语言"
    if any(k in t for k in ["画","唱","舞","表演","美工","音乐","手工","联欢","节目"]): return "艺术"
    if any(k in t for k in ["分类","数","观察","探索","动物","植物","天气","光影","科学"]): return "科学"
    if any(k in t for k in ["分享","排队","合作","规则","情绪","走亲访友","交往","社会","值日","劳动(社会性)"]): return "社会"
    return "健康"

# 主领域详写行为池
BEHAVIOR = {
 "健康": ["能独立完成动作并露出得意笑容", "起初需要教师示范，后慢慢跟做", "动作略显笨拙但坚持完成", "主动向同伴展示自己学会的本领", "在儿歌提示下顺利做到"],
 "语言": ["能清楚说出相关短句", "愿意在集体前表达", "跟着教师念儿歌声音响亮", "用单词表达需求", "能回答教师的提问"],
 "社会": ["主动与同伴互动", "在教师引导下学会等待", "把玩具分给朋友", "遵守班级规则", "情绪平稳、乐于参与"],
 "科学": ["好奇地伸手探索", "观察到变化并指给教师看", "尝试比较与分类", '提出"为什么"的问题', "专注观察不分散"],
 "艺术": ["随节奏摆动身体", "大胆用声音/动作表现", "专注完成自己的作品", "与同伴合作表演", "用色彩表达心情"],
}

STAGE_NOTE = {
 "适应期": "入园初期，以稳定情绪、建立安全感与基本生活常规为主。",
 "发展期": "情绪稳定后，各项生活自理与交往能力快速发展，活动参与度明显提高。",
 "巩固期": "习惯基本养成，能在真实情境中迁移运用，并开始为升中班做准备。",
}

OTHER_DOMAIN_TPL = {
 "健康": ["户外活动中动作较协调，大肌肉持续发展。", "进餐、如厕等生活环节节奏顺畅。", "午休能安静入睡，精力恢复良好。"],
 "语言": ["听故事时注意力集中约8分钟。", "能用简单句与教师、同伴交流。", "喜欢跟着念儿歌，语音逐渐清晰。"],
 "社会": ["愿意靠近同伴，出现平行游戏。", "在提醒下使用礼貌用语。", "初步体验轮流与等待。"],
 "科学": ["对新鲜事物表现出好奇。", "在操作中感知因果与变化。", "能指认熟悉物品并命名。"],
 "艺术": ["听到音乐自然会随节奏动作。", "美工活动敢大胆涂画。", "表演时乐于用声音表现情绪。"],
}

def stage_of(week):
    if week <= 4: return "适应期"
    if week <= 20: return "发展期"
    return "巩固期"

def build(week, wd, d, child, theme, stage):
    theme_short = theme.split("——")[0]
    domain = guess_domain(theme)
    weather = weather_of(d.month)
    attend = min(22, 18 + week // 4) + random.choice([0,0,1,-1])
    attend = max(15, min(22, attend))
    # 时间线
    timeline = (
     f"| 8:00-8:30 | 晨检·接待 | 保健医测体温看手口；教师门口微笑迎接，{child[0]}主动问好 |\n"
     f"| 9:00-9:30 | 集体教学 | 《{theme_short}》——{theme.split('——')[-1]} |\n"
     f"| 9:30-10:00 | 区域游戏 | 幼儿按兴趣进入娃娃家、建构区、美工区、图书角 |\n"
     f"| 10:00-10:30 | 户外游戏 | 依据主题开展体育或情景游戏 |\n"
     f"| 11:00-11:30 | 午餐 | 练习用勺独立进餐，餐后收餐具 |\n"
     f"| 12:00-14:30 | 午睡 | 听《睡觉歌》安静入睡 |\n"
     f"| 15:00-15:30 | 离园 | 与家长拥抱道别，说\"明天见\" |"
    )
    # 五大领域
    paras = []
    order = ["健康","语言","社会","科学","艺术"]
    for dom in order:
        if dom == domain:
            b = random.choice(BEHAVIOR[dom])
            line = "- **%s**：今日重点。%s活动中，%s%s。" % (dom, theme_short, child[0], b)
        else:
            line = "- **%s**：%s" % (dom, random.choice(OTHER_DOMAIN_TPL[dom]))
        paras.append(line)
    domain_block = "\n".join(paras)
    # 观察笔记
    b2 = random.choice(BEHAVIOR[domain])
    note = ("- **对象**：%s（%s，%s）\n- **目的**：观察其在「%s」中的%s发展。\n"
            "- **情景描述**：%s在活动中%s，教师及时鼓励，情绪积极。\n"
            "- **分析**：符合《指南》小班\"%s\"典型表现，后续保持家园一致强化。") % (
            child[0], child[1], child[2], theme_short, domain, child[0], b2,
            {"健康":"动作协调与自理","语言":"倾听与表达","社会":"人际交往","科学":"好奇与探究","艺术":"感受与表现"}[domain])
    # 家园联系
    advice = {
     "健康":"在家也用同样的步骤/儿歌巩固，不包办代替。",
     "语言":"每天亲子共读，鼓励孩子用完整话说出需求。",
     "社会":"创造与同伴玩耍机会，练习轮流与分享。",
     "科学":"带孩子观察自然与生活现象，保护好奇心。",
     "艺术":"多听儿歌、鼓励大胆涂画与表演，不追求像不像。",
    }[domain]
    # 明日
    if wd < 4:
        nxt = WEEKS[week][wd+1].split("——")[0]
    else:
        nxt = WEEKS[week+1][0].split("——")[0] if week < 40 else "升中班准备"
    md = (
     "# 小班成长日志 · %d年%d月%d日（%s）%s\n\n"
     "> 本月主题衔接小班健康课程第%d周。阶段特点：%s\n"
     "> 记录人：主班教师 林老师 ｜ 当日出勤：应到22人，实到%d人。\n\n"
     "---\n\n## 一、今日概览\n\n| 项目 | 内容 |\n|------|------|\n"
     "| 天气 | %s |\n| 当日主题 | %s |\n| 重点领域 | %s |\n| 重点观察幼儿 | %s（%s，%s） |\n\n"
     "---\n\n## 二、一日活动流程（时间线）\n\n| 时间 | 环节 | 内容与观察 |\n|------|------|-----------|\n%s\n\n"
     "---\n\n## 三、五大领域观察记录\n\n%s\n\n"
     "---\n\n## 四、教师观察笔记\n\n%s\n\n"
     "---\n\n## 五、教师评语\n\n本周教学围绕「%s」展开，%s多数幼儿能在教师支持下参与并完成目标，"
     "个别幼儿尚需反复练习，属正常发展规律，循序渐进即可。\n\n"
     "---\n\n## 六、家园联系\n\n- **今日分享给家长**：%s活动照片与视频片段。\n"
     "- **家庭延伸建议**：%s\n\n---\n\n## 七、明日计划\n\n1. 明日主题：《%s》。\n2. 延续今日重点，在游戏中巩固。\n"
    ) % (d.year, d.month, d.day, WEEKDAY_CN[wd], weather, week, STAGE_NOTE[stage],
         attend, weather, theme, domain, child[0], child[1], child[2],
         timeline, domain_block, note, theme_short, stage, theme_short, advice, nxt)
    return md

def main():
    cnt = 0
    skip = 0
    idx = 0
    for wi, ws in enumerate(WEEK_START, start=1):
        for wd in range(5):
            d = ws + timedelta(days=wd)
            if d in HOLIDAY:
                continue
            fname = "%04d-%02d-%02d.md" % (d.year, d.month, d.day)
            fpath = os.path.join(OUT, fname)
            if os.path.exists(fpath):
                skip += 1
                continue
            child = CHILDREN[idx % len(CHILDREN)]
            idx += 1
            theme = WEEKS[wi][wd]
            stage = stage_of(wi)
            md = build(wi, wd, d, child, theme, stage)
            with open(fpath, "w", encoding="utf-8") as f:
                f.write(md)
            cnt += 1
    print("生成 %d 篇，跳过已存在(手工样本) %d 篇。" % (cnt, skip))

if __name__ == "__main__":
    main()
