# -*- coding: utf-8 -*-
import sys, socket, json, time, urllib.request, base64, os
sys.stdout.reconfigure(encoding='utf-8')

HOST = "localhost"
PORT = 9222

TITLE = '放春假的孩子开心到"模糊"，而家长还在焦虑"弯道超车"？'

IMAGE_PATH = r'C:\Users\Louis\WorkBuddy\Claw\cover_image.jpg'

PARAGRAPHS = [
    ('normal',    '近日，四川德阳一所学校的春假安排引发全网热议——六天假期，无作业。校长宣布消息时，孩子们欢呼雀跃、原地跳起的画面，让无数网友直呼"破防"。有人笑称"建议全国推广"，也有人调侃"请问还招二十多岁的学生吗？"这看似轻松的一幕，实则触动了教育焦虑的深层神经：当"卷"成为常态，我们是否还记得，学习的本质，是成长，而非消耗？'),
    ('divider',   ''),
    ('heading',   '一、被"作业"绑架的童年，何时才能真正"放假"？'),
    ('normal',    '在许多人的记忆里，假期=补习班+试卷+家长的催促。即便是春节、清明这样的传统节日，也常被"弯道超车"的焦虑填满。四川这所学校的"无作业春假"，之所以让人羡慕，是因为它把时间还给了孩子——去赏花、去奔跑、去发呆，去体验春天本该有的样子。'),
    ('normal',    '这并非"放羊"，而是一种教育理念的回归：真正的学习，发生在生活里。'),
    ('normal',    '孩子在田野间观察植物生长，比背诵生物课本更生动；在家庭旅行中规划路线、管理预算，比刷题更能锻炼综合能力。正如网友所言："小时候欠我的假期，谁还我？"——我们缺的不是知识，而是被允许"浪费"的时间。'),
    ('divider',   ''),
    ('heading',   '二、学业规划的真相：不是"学得更多"，而是"学得更对"'),
    ('normal',    '面对中考、高考、考研、考公、国央企就业等人生关键节点，家长和学生常陷入"多学=多分=多出路"的迷思。但现实是：'),
    ('list',      '中考、高考：拼的是效率与心态，不是刷题时长。'),
    ('list',      '考研、考公：重在策略与信息差，不是盲目跟风。'),
    ('list',      '国央企就业：看重综合素养与实践能力，不是证书堆砌。'),
    ('normal',    '四川这所学校的"无作业春假"，恰恰提醒我们：真正的竞争力，来自松弛感。'),
    ('normal',    '一个被作业压得喘不过气的孩子，很难有创造力；一个被"必须成功"裹挟的青年，很难有抗挫力。而这些，恰恰是未来职场最稀缺的品质。'),
    ('divider',   ''),
    ('heading',   '三、给家长与学生的3条"反内卷"建议'),
    ('highlight', '1. 学会"战略性休息"'),
    ('normal',    '假期不是"补课黄金期"，而是调整节奏、积蓄能量的窗口。与其逼孩子刷题，不如带他去爬山、看电影、做志愿——这些"无用之用"，恰恰是人格塑造的关键。'),
    ('highlight', '2. 重新定义"成功路径"'),
    ('normal',    '中考、高考只是人生一站，考研、考公、国央企就业也非唯一出路。'),
    ('list',      '有人适合走学术路线，有人适合技能发展；'),
    ('list',      '有人擅长应试，有人长于实践。'),
    ('normal',    '尊重个体差异，比盲目追赶更重要。'),
    ('highlight', '3. 培养"终身学习力"'),
    ('normal',    '真正的学霸，不是靠假期刷题，而是拥有自主规划、自我驱动、持续迭代的能力。'),
    ('normal',    '这种能力，恰恰在"无作业"的自由中萌芽——当孩子学会自己安排时间，他才真正掌握了学习的主动权。'),
    ('divider',   ''),
    ('heading',   '四、结语：教育的终极目标，是让人"活得像个人"'),
    ('normal',    '四川这所学校的春假，不是"减负"的终点，而是教育觉醒的起点。'),
    ('normal',    '它告诉我们：'),
    ('list',      '孩子不是考试机器，而是有血有肉的生命；'),
    ('list',      '学习不是苦行僧式的修行，而是探索世界的过程；'),
    ('list',      '成功不是千军万马过独木桥，而是找到适合自己的节奏。'),
    ('normal',    '正如一位网友所说："我们不是反对学习，而是反对把学习变成折磨。"'),
    ('normal',    '愿每一个孩子，都能在春天里奔跑，而不是在题海中沉没；'),
    ('normal',    '愿每一个青年，都能在人生路上从容前行，而不是在焦虑中迷失。'),
    ('divider',   ''),
    ('highlight', '今日互动'),
    ('normal',    '你支持"春假无作业"吗？'),
    ('normal',    '如果你是家长，你会让孩子在假期"彻底放松"还是"弯道超车"？'),
    ('normal',    '欢迎在评论区留言，我们一起探讨教育的另一种可能。'),
]

def format_paragraph(style, text):
    if style == 'normal':
        return '　　' + text
    elif style == 'heading':
        return '【' + text + '】'
    elif style == 'divider':
        return '————————————————————'
    elif style == 'highlight':
        return text
    elif style == 'list':
        return '• ' + text
    return text

# ── CDP helpers ──────────────────────────────────────────────────────────────

def ws_send(sock, obj):
    sock.send((json.dumps(obj) + '\n').encode())

def ws_recv(sock):
    return json.loads(sock.recv(4096).decode())

def get_targets():
    url = f'http://{HOST}:{PORT}/json'
    with urllib.request.urlopen(url) as r:
        return json.loads(r.read().decode())

def find_editor_page():
    for t in get_targets():
        if 'appmsg' in t.get('url', ''):
            return t
    return None

def click_at(sock, x, y):
    ws_send(sock, {'id': 1, 'method': 'Input.dispatchMouseEvent', 'params': {
        'type': 'mousePressed', 'x': x, 'y': y, 'button': 'left', 'clickCount': 1}})
    time.sleep(0.05)
    ws_send(sock, {'id': 2, 'method': 'Input.dispatchMouseEvent', 'params': {
        'type': 'mouseReleased', 'x': x, 'y': y, 'button': 'left', 'clickCount': 1}})
    time.sleep(0.05)

def type_text(sock, text):
    for ch in text:
        ws_send(sock, {'id': 1, 'method': 'Input.dispatchKeyEvent', 'params': {
            'type': 'char', 'text': ch}})
        time.sleep(0.01)

# ── Main ─────────────────────────────────────────────────────────────────────

if __name__ == '__main__':
    page = find_editor_page()
    if not page:
        print('[ERR] 未找到公众号编辑页面，请先运行 cdp_navigate.py 和 cdp_new_article.py')
        sys.exit(1)

    ws_url = page['webSocketDebuggerUrl']
    print(f'[OK] 找到编辑页面: {page["id"][:16]}...')

    sock = socket.socket()
    sock.settimeout(30)
    sock.connect((HOST, PORT))
    sock.send(json.dumps({'id': 1, 'method': 'Target.attachToTarget', 'params': {
        'targetId': page['id'], 'flatten': True}}).encode() + b'\n')
    time.sleep(0.3)
    sock.recv(4096)

    session_id = None
    for t in get_targets():
        if t['id'] == page['id']:
            session_id = t.get('id')
            break

    sock.close()

    # 重新连接 WebSocket
    import websocket
    ws = websocket.create_connection(ws_url)
    ws.settimeout(30)
    print('[OK] WebSocket 已连接')

    # Step 1: 填写标题
    print('[Step 1] 填写标题...')
    ws.send(json.dumps({'id': 10, 'method': 'Runtime.evaluate', 'params': {
        'expression': f'document.getElementById("title").value = "{TITLE}"'}}))
    time.sleep(0.5)
    print(f'  标题已填入: {TITLE[:30]}...')

    # Step 2: 聚焦正文编辑器
    print('[Step 2] 聚焦正文编辑器...')
    ws.send(json.dumps({'id': 20, 'method': 'Runtime.evaluate', 'params': {
        'expression': 'document.querySelector("#edit_area, .edit_area").focus()'}}))
    time.sleep(0.5)

    # Step 3: 插入正文内容
    print('[Step 3] 插入正文段落...')
    for i, (style, text) in enumerate(PARAGRAPHS):
        formatted = format_paragraph(style, text)
        
        # 点击编辑器确保焦点
        ws.send(json.dumps({'id': 30+i, 'method': 'Runtime.evaluate', 'params': {
            'expression': 'document.querySelector("#edit_area, .edit_area").click()'}}))
        time.sleep(0.1)
        
        # 输入内容
        ws.send(json.dumps({'id': 40+i, 'method': 'Runtime.evaluate', 'params': {
            'expression': f'document.execCommand("insertText", false, `{formatted.replace(chr(96), chr(96)+chr(96))}`)'}}))
        time.sleep(0.1)
        
        # 换行
        ws.send(json.dumps({'id': 50+i, 'method': 'Runtime.evaluate', 'params': {
            'expression': 'document.execCommand("insertParagraph", false, null)'}}))
        time.sleep(0.1)
        
        if i % 10 == 0:
            print(f'  已插入 {i}/{len(PARAGRAPHS)} 段...')

    print(f'[OK] 正文共 {len(PARAGRAPHS)} 段插入完成')

    ws.close()
    print('[DONE] 填写完成')
