#!/usr/bin/env python3
"""生成能力考察项表格 markdown"""

def row(单项, rowspan, 考察项, 描述):
    """生成一行，rowspan=0表示无rowspan"""
    if rowspan > 1:
        td1 = f'      <lark-td rowspan="{rowspan}">\n        **{单项}**\n      </lark-td>'
    else:
        td1 = f'    <lark-td>\n      **{单项}**\n    </lark-td>'
    return f'''  <lark-tr>
{td1}
    <lark-td>
      **{考察项}**
    </lark-td>
    <lark-td>
      {描述}
    </lark-td>
  </lark-tr>'''

def build_table(items_by_skill, skill_order):
    """items_by_skill: {技能: [(考察项, 描述)]}"""
    rows_md = []
    total = 1  # header
    for sk in skill_order:
        items = items_by_skill.get(sk, [])
        if not items:
            items = [("无", "无")]
        n = len(items)
        total += n
        for i, (item, desc) in enumerate(items):
            rs = n if i == 0 else 0
            rows_md.append(row(sk, rs, item, desc))
    
    header = '''<lark-table rows="{rows}" cols="3" column-widths="100,164,560">

  <lark-tr>
    <lark-td>
      **单项**
    </lark-td>
    <lark-td>
      **考察项**
    </lark-td>
    <lark-td>
      **考察项描述**
    </lark-td>
  </lark-tr>'''.format(rows=total)
    
    return header + '\n\n' + '\n'.join(rows_md) + '\n</lark-table>'

# ========== L1 ==========

L1_S2 = build_table({
    "听力": [
        ("听力拖拽匹配", "听到场景描述后，将对应人物或物品拖拽到正确目标位置。"),
        ("图片选图", "听一个完整英文句子，从多幅图片中选出与听到内容一致的选项。"),
        ("短对话选择", "听一段简短英文对话，根据问题从选项中选择正确答案。"),
    ],
    "口语": [
        ("日常话题应答", "根据动作、物品、个人信息等日常话题提问，用完整短句做出恰当应答。"),
        ("话题讨论", "就一个简单话题，用多个句子表达个人观点并做简单扩展。"),
    ],
    "阅读": [
        ("信息匹配", "阅读多个简短英文文本，将文本中的关键信息与对应选项正确匹配。"),
    ],
    "写作": [
        ("看图书面回答", "观察图片和英文提示，用单词或短语写出书面回答。"),
        ("邮件回复", "阅读一封简短英文邮件，根据写作要求完成邮件回复。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L1_S3 = build_table({
    "听力": [
        ("短对话选择", "听简短英文对话，根据题目从选项中选择正确答案。"),
        ("表格填空", "听到信息后，将数字、时间、地点等细节填入表格对应位置。"),
    ],
    "口语": [
        ("日常话题应答", "根据日常话题提问（喜好、经历、计划等），用多句做出完整应答。"),
        ("话题讨论", "就一个熟悉话题，用多个句子表达观点并给出简短理由。"),
    ],
    "阅读": [
        ("信息匹配", "阅读多个简短文本，提取关键信息并与对应选项匹配。"),
        ("段落匹配", "将短文段落与对应主题或标题进行匹配，测试段落主旨理解。"),
    ],
    "写作": [
        ("邮件回复", "阅读一封英文邮件，根据写作提示组织语句完成邮件回复。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L1_S4 = build_table({
    "听力": [
        ("短对话选择", "听日常场景的简短对话，根据问题从选项中选出正确答案。"),
        ("表格填空", "听到对话或独白后，提取数字、时间、地点等信息填入表格。"),
        ("信息匹配", "听一段多人对话，将不同人物与其对应信息准确匹配。"),
    ],
    "口语": [
        ("日常话题应答", "就个人经历、偏好等话题，用连贯的多句做出完整回答。"),
        ("话题讨论", "就一个话题表达个人观点，用理由支撑并做简单扩展。"),
    ],
    "阅读": [
        ("信息匹配", "在多个短文本间快速扫读定位关键信息，完成与选项的对应匹配。"),
        ("长文选择", "阅读一段较长英文文章，根据内容从选项中选择正确答案。"),
        ("完形填空", "阅读一篇有空缺的短文，从选项中选择正确单词填入空白处。"),
        ("开放填空", "阅读一篇短文，根据上下文在空白处直接写出正确的单词。"),
    ],
    "写作": [
        ("邮件回复", "阅读一封英文邮件，根据提示组织语句完成一封完整的邮件回复。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L1_S5 = build_table({
    "听力": [
        ("短对话选择", "听多轮短对话，根据主题和细节从选项中选择正确答案。"),
        ("表格填空", "听到独白或对话后，提取并记录多个信息字段到表格中。"),
        ("信息匹配", "听一段包含多人信息的对话，将说话者与其观点、行为匹配。"),
    ],
    "口语": [
        ("日常话题应答", "就日常生活、学习和活动话题，用连贯完整句做出自然应答。"),
        ("话题讨论", "就一个话题进行多句讨论，表达观点、理由并适当回应追问。"),
    ],
    "阅读": [
        ("信息匹配", "快速扫读多个短文本，将关键信息与对应选项精准匹配。"),
        ("段落匹配", "将短文段落与对应的标题或主题进行匹配。"),
        ("长文选择", "阅读长篇英文文章，根据内容理解从选项中选择正确答案。"),
        ("完形填空", "阅读一篇有空缺的短文，根据语法和语境选择正确单词填入。"),
    ],
    "写作": [
        ("邮件回复", "根据邮件内容提示，完成一封语句连贯、格式规范的邮件回复。"),
        ("看图写作", "根据三幅连续图片提示，用连贯语句叙述一个完整故事。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L1_S6 = build_table({
    "听力": [
        ("短对话选择", "听涉及推理、态度的短对话，根据问题从选项中选择正确答案。"),
        ("表格填空", "听独白或长对话，提取多层次信息并准确填入表格对应字段。"),
        ("信息匹配", "听多段短对话，将不同对话者与对应信息、偏好完成匹配。"),
    ],
    "口语": [
        ("话题讨论", "就一个话题进行深入讨论，表达观点并给出清晰的理由支撑。"),
        ("看图回答", "观察图片内容，听懂提问后用完整句描述图中信息并表达看法。"),
    ],
    "阅读": [
        ("信息匹配", "快速扫读多个文本，精准定位关键信息并完成对应匹配。"),
        ("段落匹配", "将段落与对应主旨标题进行匹配，测试段落大意的概括能力。"),
        ("长文选择", "阅读长篇英文文章，根据深层内容理解从选项中选择正确答案。"),
        ("完形填空", "阅读一篇有多个空缺的短文，根据语法和语义选择正确单词填入。"),
        ("开放填空", "在语境中直接写出正确的单词，测试词汇拼写和语法掌握。"),
    ],
    "写作": [
        ("邮件回复", "根据邮件内容和写作要求，完成一封语句流畅、格式规范的邮件。"),
        ("看图写作", "根据系列图片提示，用连贯多句话叙述一个逻辑完整的短故事。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

# ========== L2 ==========

L2_S1 = build_table({
    "听力": [
        ("图片选图", "听英文句子或短对话，从多幅图片中选出与听到内容一致的选项。"),
        ("听力拖拽匹配", "听到描述或指令后，将对应元素拖拽到正确目标位置完成匹配。"),
    ],
    "口语": [
        ("日常话题应答", "根据个人信息、喜好、经历等日常话题提问，用完整句做出应答。"),
        ("看图识物", "观察图片中的物品、人物或动物，听懂提问后口头说出对应的名称。"),
    ],
    "阅读": [
        ("无", "无"),
    ],
    "写作": [
        ("无", "无"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S2 = build_table({
    "听力": [
        ("听力拖拽匹配", "听到多人描述后，将不同人物或物品拖拽到对应位置完成匹配。"),
        ("图片选图", "听一段描述或对话，从多幅图片中选出与内容一致的选项。"),
    ],
    "口语": [
        ("日常话题应答", "就日常话题做出完整应答，用多句表达个人信息和观点。"),
        ("看图回答", "观察图片内容，听懂提问后用完整句描述图中的人、物和场景。"),
    ],
    "阅读": [
        ("无", "无"),
    ],
    "写作": [
        ("无", "无"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S3 = build_table({
    "听力": [
        ("图片选图", "听涉及推理、偏好判断的英文句子，从图片选项中选出正确匹配。"),
    ],
    "口语": [
        ("日常话题应答", "就个人信息、经历和观点等话题，用连贯语句做出完整应答。"),
        ("看图回答", "观察图片场景，听懂提问后用完整句描述图中内容和关键信息。"),
    ],
    "阅读": [
        ("看图判断", "阅读简短英文句子，观察对应图片，判断句义与图片内容是否一致。"),
    ],
    "写作": [
        ("邮件回复", "阅读一封英文邮件，根据写作提示组织语句完成一封简短的邮件回复。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S4 = build_table({
    "听力": [
        ("长对话选择", "听一段多轮英文对话，根据问题从选项中选择正确答案。"),
        ("表格填空", "听独白或对话后，提取关键信息并填入表格对应位置。"),
    ],
    "口语": [
        ("日常话题应答", "就日常话题做出多句连贯应答，表达清晰的观点和理由。"),
        ("话题讨论", "就一个给定话题，用多句表达个人看法并做适当扩展讨论。"),
    ],
    "阅读": [
        ("信息匹配", "在多个短文本间快速扫读定位关键信息，完成与选项的对应匹配。"),
        ("看图判断", "阅读英文句子并观察图片，判断句义与图片内容是否一致。"),
    ],
    "写作": [
        ("邮件回复", "根据邮件内容提示，完成一封语句连贯、内容完整的邮件回复。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S5 = build_table({
    "听力": [
        ("长对话选择", "听涉及态度、情绪的多轮英文对话，根据深层理解选择正确答案。"),
        ("表格填空", "听独白类材料，在连贯叙述中定位并准确记录多个结构化信息字段。"),
    ],
    "口语": [
        ("话题讨论", "就一个话题展开讨论，表达观点并给出充分的理由和例证。"),
        ("看图回答", "观察图片提示，听懂提问后用连贯语句描述场景并表达看法。"),
    ],
    "阅读": [
        ("信息匹配", "在多个文本间扫读定位关键信息，完成与对应选项的精准匹配。"),
        ("长文选择", "阅读较长英文文章，根据内容理解和推理从选项中选择正确答案。"),
        ("完形填空", "阅读一篇有多个空缺的文章，根据语法和语境选择正确单词填入。"),
    ],
    "写作": [
        ("邮件回复", "根据邮件内容完成一封语句流畅、格式规范、内容完整的邮件。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S6 = build_table({
    "听力": [
        ("长对话选择", "听涉及推理判断、态度识别的长对话，根据深层理解选择正确答案。"),
        ("表格填空", "听独白材料，提取并记录多个维度的结构化信息到表格中。"),
        ("信息匹配", "听多段短对话，将不同说话者的信息、观点和态度准确匹配。"),
    ],
    "口语": [
        ("话题讨论", "就一个话题进行深入讨论，表达清晰观点并用逻辑理由支撑。"),
        ("看图回答", "观察图片场景，听懂提问后用完整连贯语句描述并分析图中信息。"),
    ],
    "阅读": [
        ("信息匹配", "扫读多个文本，快速定位关键信息并完成与选项的对应匹配。"),
        ("长文选择", "阅读长篇英文文章，根据深层理解和推理判断选择正确答案。"),
        ("完形填空", "在长文完形填空中，根据语法规则和语义逻辑选出正确单词。"),
        ("开放填空", "在语境中根据上下文直接写出正确的单词，测试语法和拼写。"),
    ],
    "写作": [
        ("邮件回复", "根据邮件内容和写作要求，完成一封语句流畅、要点完整的邮件。"),
        ("看图写作", "根据系列图片提示，用连贯多句叙述一个逻辑完整的故事。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S7 = build_table({
    "听力": [
        ("长对话选择", "在短对话、长对话和独白等不同题型间自如切换，听力速度和精度同步提升。"),
        ("表格填空", "在多种听力材料中提取并准确记录多层次结构化信息。"),
        ("信息匹配", "听多段不同类型对话，综合判断并将信息与对应选项完成准确匹配。"),
    ],
    "口语": [
        ("话题讨论", "就一个话题展开深入讨论，用清晰、连贯、得体的语句进行多轮表达。"),
        ("看图回答", "观察图片并回答提问，用完整语句描述场景、分析信息并表达观点。"),
    ],
    "阅读": [
        ("信息匹配", "在多个文本间快速扫读并精准定位关键信息完成匹配。"),
        ("长文选择", "阅读长篇文章，根据深层理解、推理和主旨概括选择正确答案。"),
        ("完形填空", "在长文中根据语法和语义综合判断，选出正确的单词填入空白。"),
        ("开放填空", "根据上下文语境和语法规则，直接写出正确单词完成语篇补全。"),
        ("看图判断", "阅读英文句子并对照图片，判断句图一致性。"),
    ],
    "写作": [
        ("邮件回复", "完成一封语句流畅、格式规范、内容完整的高质量邮件回复。"),
        ("看图写作", "根据系列图片提示，用连贯多句叙述一个结构完整的故事。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

L2_S8 = build_table({
    "听力": [
        ("长对话选择", "KET听力全题型综合运用，覆盖短对话选图、长对话选择和信息匹配。"),
        ("表格填空", "独白填表题的冲刺训练，确保信息提取的准确性和完整性。"),
        ("信息匹配", "多段短对话并行匹配和长对话信息匹配的综合冲刺训练。"),
    ],
    "口语": [
        ("话题讨论", "KET口语两大题型模拟冲刺——个人信息问答和协作任务讨论。"),
        ("看图回答", "在真实考试场景中用清晰、连贯、得体的口语完成全部任务。"),
    ],
    "阅读": [
        ("信息匹配", "KET五大阅读题型全覆盖——标识理解和信息匹配的综合运用。"),
        ("长文选择", "长文阅读的冲刺训练，覆盖细节理解、推理判断和主旨概括。"),
        ("完形填空", "完形填空的全面复盘，语法和语义判断能力综合提升。"),
        ("开放填空", "开放填空的冲刺训练，词汇拼写和语法规则的全面巩固。"),
        ("看图判断", "句图一致性判断的持续练习，巩固阅读基础技能。"),
    ],
    "写作": [
        ("邮件回复", "短消息写作的全面复盘，含格式规范、衔接连贯和语法准确度。"),
        ("看图写作", "看图写故事的冲刺训练，含叙事组织、词汇丰富度和时态一致性。"),
    ],
}, ["听力", "口语", "阅读", "写作"])

# Build full markdown
stages = [
    ("L1", "阶段1", [], None),  # already in doc
    ("L1", "阶段2（U9-U16 · Starters基础）", L1_S2, None),
    ("L1", "阶段3（U17-U24 · Starters达标）", L1_S3, None),
    ("L1", "阶段4（U25-U32 · Movers入门）", L1_S4, None),
    ("L1", "阶段5（U33-U40 · Movers基础）", L1_S5, None),
    ("L1", "阶段6（U41-U48 · Movers达标）", L1_S6, None),
    ("L2", "阶段1（U1-U6 · Flyers入门）", L2_S1, None),
    ("L2", "阶段2（U7-U12 · Flyers基础）", L2_S2, None),
    ("L2", "阶段3（U13-U18 · Flyers达标）", L2_S3, None),
    ("L2", "阶段4（U19-U24 · KET入门）", L2_S4, None),
    ("L2", "阶段5（U25-U30 · KET基础）", L2_S5, None),
    ("L2", "阶段6（U31-U36 · KET强化）", L2_S6, None),
    ("L2", "阶段7（U37-U42 · KET高位）", L2_S7, None),
    ("L2", "阶段8（U43-U48 · KET达标）", L2_S8, None),
]

out = []
current_level = None
for level, stage_name, table, _ in stages:
    if level != current_level:
        current_level = level
        out.append(f'\n## {level} 级别\n')
    out.append(f'### {stage_name}\n')
    if table:
        out.append(table)

print('\n'.join(out))
