#!/usr/bin/env python3
"""Generate a clean, well-formatted docx of Li Bai poetry imagery with Thai equivalents."""

from docx import Document
from docx.shared import Pt, Inches, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml
import copy

doc = Document()

# ── Page setup ──
for section in doc.sections:
    section.page_width = Cm(29.7)  # A4 landscape
    section.page_height = Cm(21.0)
    section.left_margin = Cm(1.5)
    section.right_margin = Cm(1.5)
    section.top_margin = Cm(1.5)
    section.bottom_margin = Cm(1.5)

# ── Styles ──
style = doc.styles['Normal']
font = style.font
font.name = 'SimSun'
font.size = Pt(9)
style.element.rPr.rFonts.set(qn('w:eastAsia'), 'SimSun')

def set_cell_shading(cell, color):
    """Set cell background color."""
    shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color}"/>')
    cell._tc.get_or_add_tcPr().append(shading)

def make_header_row(table, texts, color="4472C4"):
    row = table.rows[0]
    for i, text in enumerate(texts):
        cell = row.cells[i]
        cell.text = ""
        p = cell.paragraphs[0]
        run = p.add_run(text)
        run.bold = True
        run.font.size = Pt(10)
        run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        set_cell_shading(cell, color)

def add_data_row(table, row_idx, data):
    """Fill cells in a specific row with data (list of strings)."""
    row = table.rows[row_idx]
    for i, text in enumerate(data):
        cell = row.cells[i]
        cell.text = ""
        p = cell.paragraphs[0]
        run = p.add_run(text)
        run.font.size = Pt(8)
        # Alternate row shading
        if row_idx % 2 == 0:
            set_cell_shading(cell, "F2F2F2")

def add_merged_row(table, img_text, num_cols=5):
    """Add a row and merge cells with category header."""
    row = table.add_row()
    if num_cols > 1:
        row.cells[0].merge(row.cells[num_cols-1])
    cell = row.cells[0]
    cell.text = ""
    p = cell.paragraphs[0]
    run = p.add_run(img_text)
    run.bold = True
    run.font.size = Pt(11)
    run.font.color.rgb = RGBColor(0x1F, 0x49, 0x7D)
    set_cell_shading(cell, "D6E4F0")
    return row

# ════════════════════════════════════════════
# DATA: (意象, 别称/雅称/代称, 泰语别称, 例句, 出处)
# Thai column is the main addition
# ════════════════════════════════════════════

animal_data = [
    # (意象, 中文别称, 泰语别称, 例句, 出处)
    ("大鹏", "鲲鹏", "พญาครุฑ / นกเผิง",
     "大鹏一日同风起，扶摇直上九万里。", "《上李邕》"),
    ("", "", "",
     "大鹏飞兮振八裔，中天摧兮力不济。", "《临路歌》"),
    ("龙", "蛟龙、应龙、螭龙、虬龙、云螭",
     "มังกร / พญานาค / มังกรจีน",
     "上有六龙回日之高标，下有冲波逆折之回川。", "《蜀道难》"),
    ("虎", "山君、斑子、大虫",
     "เสือ / เสือโคร่ง",
     "虎鼓瑟兮鸾回车，仙之人兮列如麻。", "《梦游天姥吟留别》"),
    ("", "", "",
     "朝避猛虎，夕避长蛇。", "《蜀道难》"),
    ("凤 / 鸾", "瑞羽、仪鸟、丹山鸟、九苞鸟",
     "หงส์จีน / เฟิ่งหวง",
     "凤凰台上凤凰游，凤去台空江自流。", "《登金陵凤凰台》"),
    ("", "", "",
     "虎鼓瑟兮鸾回车，仙之人兮列如麻。", "《梦游天姥吟留别》"),
    ("猿（含白猿、猿猱）", "啼客、山公、猱",
     "ลิง / ค่าง",
     "两岸猿声啼不住，轻舟已过万重山。", "《早发白帝城》"),
    ("", "", "",
     "君莫向秋浦，猿声碎客心。", "《秋浦歌十七首·其十》"),
    ("", "", "",
     "山山白鹭满，涧涧白猿吟。", "《秋浦歌十七首·其十》"),
    ("", "", "",
     "秋浦多白猿，超腾若飞雪。牵引条上儿，饮弄水中月。", "《秋浦歌十七首·其五》"),
    ("", "", "",
     "黄鹤之飞尚不得过，猿猱欲度愁攀援。", "《蜀道难》"),
    ("黄鹤", "黄鹄、仙禽",
     "นกกระเรียนเหลือง",
     "黄鹤之飞尚不得过，猿猱欲度愁攀援。", "《蜀道难》"),
    ("", "", "",
     "仙人有待乘黄鹤，海客无心随白鸥。", "《江上吟》"),
    ("白鹭", "白鸟、雪衣、舂锄",
     "นกกระยาง",
     "山山白鹭满，涧涧白猿吟。", "《秋浦歌十七首·其十》"),
    ("白鸥", "闲鸥、水鸥、沙鸥",
     "นกนางนวล",
     "海客无心随白鸥。", "《江上吟》"),
    ("子规（杜鹃）", "杜宇、催归、蜀魄、怨鸟",
     "นกคัคคู / นกดุเหว่า",
     "又闻子规啼夜月，愁空山。", "《蜀道难》"),
    ("", "", "",
     "杨花落尽子规啼，闻道龙标过五溪。", "《闻王昌龄左迁龙标遥有此寄》"),
    ("鸿雁 / 秋雁", "征雁、宾鸿、雁字、书空",
     "ห่านป่า",
     "长风万里送秋雁，对此可以酣高楼。", "《宣州谢朓楼饯别校书叔云》"),
    ("", "", "",
     "鸿雁西北来，嘤嘤度关山。", "《千里思》"),
    ("马（含龙马、天马）", "龙媒、骏骨、骅骝、骐骥、龙驹",
     "ม้า / ม้าสวรรค์",
     "五花马，千金裘，呼儿将出换美酒。", "《将进酒》"),
    ("", "", "",
     "龙马花雪毛，金鞍五陵豪。", "《白马篇》"),
    ("", "", "",
     "天马徕兮从西极，经万里兮归有德。", "《天马歌》"),
    ("白鹿", "玄鹿、仙鹿",
     "กวางขาว / กวางเซียน",
     "且放白鹿青崖间，须行即骑访名山。", "《梦游天姥吟留别》"),
    ("鱼 / 鲤鱼", "赤鲤、锦鳞、尺素",
     "ปลา / ปลาคาร์พ",
     "黄河三尺鲤，本在孟津居。点额不成龙，归来伴凡鱼。", "《赠崔侍郎·其一》"),
    ("", "", "",
     "北溟有巨鱼，身长数千里。仰喷三山雪，横吞百川水。", "《古风·其三十三》"),
    ("青鸟", "青禽、信使",
     "นกสีคราม (ผู้ส่งสารในเทพนิยายจีน)",
     "青鸟海上来，今朝发何处。", "《有所思》"),
    ("猕猴", "禺",
     "ลิง",
     "猕猴骑土牛，羸马夹双辕。", "《赠宣城宇文太守兼呈崔侍御》"),
    ("麋鹿", "麈",
     "กวางเอลก์",
     "各守麋鹿志，耻随龙虎争。", "《山人劝酒》"),
    ("巨鳌 / 鳖", "大鼇、神龟",
     "เต่ายักษ์",
     "巨鳌莫戴三山去，我欲蓬莱顶上行。", "《怀仙歌》"),
    ("", "", "",
     "巨鳌未斩海水动，鱼龙奔走安得宁。", "《猛虎行》"),
    ("狐", "野干",
     "สุนัขจิ้งจอก",
     "奸臣欲窃位，树党自相群。果然田成子，一旦杀齐君。狐狸不足论。", "《古风·其五十三》"),
    ("兔", "玉兔、月兔、明视",
     "กระต่าย",
     "白兔捣药秋复春，嫦娥孤栖谁与邻。", "《把酒问月》"),
    ("", "", "",
     "少年猎得平原兔，马后横捎意气归。", "《观猎》"),
    ("蚕", "丝虫",
     "หนอนไหม",
     "蚕丛及鱼凫，开国何茫然。", "《蜀道难》"),
    ("燕", "玄鸟、春燕、社燕",
     "นกนางแอ่น",
     "双燕复双燕，双飞令人羡。", "《双燕离》"),
    ("", "", "",
     "燕草如碧丝，秦桑低绿枝。", "《春思》"),
    ("犬", "黄耳、地羊",
     "สุนัข",
     "犬吠水声中，桃花带露浓。", "《访戴天山道士不遇》"),
    ("鸡（含天鸡）", "司晨、烛夜、翰音",
     "ไก่ / ไก่สวรรค์",
     "羞逐长安社中儿，赤鸡白雉赌梨栗。", "《行路难·其二》"),
    ("", "", "",
     "半壁见海日，空中闻天鸡。", "《梦游天姥吟留别》"),
    ("牛（含土牛、青牛）", "太牢、黄犊",
     "วัว / ควาย",
     "猕猴骑土牛，羸马夹双辕。", "《赠宣城宇文太守兼呈崔侍御》"),
    ("", "", "",
     "花暖青牛卧，松高白鹤眠。", "《寻雍尊师隐居》"),
]

nature_data = [
    ("明月", "白玉盘、瑶台镜、阴精、大明、素娥、冰轮、玉轮、桂魄、蟾蜍、婵娟、玉弓、玉兔、望舒",
     "พระจันทร์ / จันทร์ / เดือน",
     "举头望明月，低头思故乡。", "《静夜思》"),
    ("", "", "",
     "青天有月来几时？我今停杯一问之。", "《把酒问月》"),
    ("", "", "",
     "小时不识月，呼作白玉盘。又疑瑶台镜，飞在青云端。", "《古朗月行》"),
    ("", "", "",
     "白兔捣药秋复春，嫦娥孤栖谁与邻。", "《把酒问月》"),
    ("黄河", "河、悬河、浊河",
     "แม่น้ำเหลือง",
     "君不见黄河之水天上来，奔流到海不复回。", "《将进酒》"),
    ("", "", "",
     "欲渡黄河冰塞川，将登太行雪满山。", "《行路难·其一》"),
    ("长江", "江、大江、九派",
     "แม่น้ำแยงซี",
     "孤帆远影碧空尽，唯见长江天际流。", "《黄鹤楼送孟浩然之广陵》"),
    ("青山 / 敬亭山", "翠微、岑、峦、嶂、黛巘",
     "ภูเขาสีเขียว / เขา",
     "相看两不厌，只有敬亭山。", "《独坐敬亭山》"),
    ("", "", "",
     "两岸青山相对出，孤帆一片日边来。", "《望天门山》"),
    ("云", "玉叶、纤凝、瑞霭",
     "เมฆ",
     "众鸟高飞尽，孤云独去闲。", "《独坐敬亭山》"),
    ("", "", "",
     "明月出天山，苍茫云海间。", "《关山月》"),
    ("瀑布", "飞流、悬泉、匹练",
     "น้ำตก",
     "飞流直下三千尺，疑是银河落九天。", "《望庐山瀑布》"),
    ("花", "红英、芳菲、落英、奇葩",
     "ดอกไม้",
     "花间一壶酒，独酌无相亲。", "《月下独酌·其一》"),
    ("", "", "",
     "云想衣裳花想容，春风拂槛露华浓。", "《清平调·其一》"),
    ("", "", "",
     "风吹柳花满店香，吴姬压酒唤客尝。", "《金陵酒肆留别》"),
    ("雪", "六出、六花、琼芳、玉尘、玉龙、银粟、素尘、寒酥、凝雨、玉蝶、玉鸾",
     "หิมะ",
     "欲渡黄河冰塞川，将登太行雪满山。", "《行路难·其一》"),
    ("", "", "",
     "燕山雪花大如席，片片吹落轩辕台。", "《北风行》"),
    ("落日 / 夕阳", "残阳、斜阳、夕照、西景、落晖",
     "ตะวันตกดิน / อาทิตย์อัสดง",
     "浮云游子意，落日故人情。", "《送友人》"),
    ("", "", "",
     "西辉逐流水，荡漾游子情。", "《游南阳清泠泉》"),
    ("孤帆 / 轻舟", "一叶、扁舟、兰舟、孤篷",
     "เรือใบเดี่ยว",
     "孤帆远影碧空尽，唯见长江天际流。", "《黄鹤楼送孟浩然之广陵》"),
    ("", "", "",
     "轻舟已过万重山。", "《早发白帝城》"),
    ("天姥山", "—",
     "เขาเทียนเหล่า",
     "天姥连天向天横，势拔五岳掩赤城。", "《梦游天姥吟留别》"),
    ("峨眉山月", "—",
     "จันทร์เหนือเขาเอ๋อร์เหมย",
     "峨眉山月半轮秋，影入平羌江水流。", "《峨眉山月歌》"),
    ("碧水", "清波、绿波",
     "สายน้ำสีเขียว / คลื่นเขียว",
     "天门中断楚江开，碧水东流至此回。", "《望天门山》"),
    ("海 / 沧海", "八溟、沧溟、沧瀛、洪溟、鹏溟",
     "ทะเล / ทะเลสีคราม",
     "海客谈瀛洲，烟涛微茫信难求。", "《梦游天姥吟留别》"),
    ("", "", "",
     "半壁见海日，空中闻天鸡。", "《梦游天姥吟留别》"),
    ("", "", "",
     "长风破浪会有时，直挂云帆济沧海。", "《行路难·其一》"),
    ("霜", "青女、素液、铅粉",
     "น้ำค้างแข็ง",
     "床前明月光，疑是地上霜。", "《静夜思》"),
    ("", "", "",
     "不知明镜里，何处得秋霜。", "《秋浦歌十七首·其十五》"),
    ("露", "玉露、清露、珠露、白露",
     "น้ำค้าง",
     "云想衣裳花想容，春风拂槛露华浓。", "《清平调·其一》"),
    ("", "", "",
     "玉阶生白露，夜久侵罗袜。", "《玉阶怨》"),
    ("松", "大夫、十八公、苍髯",
     "ต้นสน",
     "松柏本孤直，难为桃李颜。", "《古风·其十二》"),
    ("竹", "玉管、绿玉、不秋草",
     "ต้นไผ่",
     "绿竹入幽径，青萝拂行衣。", "《下终南山过斛斯山人宿置酒》"),
    ("柳", "章台、灞岸、绿丝绦、烟柳",
     "ต้นหลิว",
     "此夜曲中闻折柳，何人不起故园情。", "《春夜洛城闻笛》"),
    ("", "", "",
     "笛中闻折柳，春色未曾看。", "《塞下曲·其一》"),
    ("桃花", "夭夭、红雨、武陵花",
     "ดอกท้อ",
     "犬吠水声中，桃花带露浓。", "《访戴天山道士不遇》"),
    ("", "", "",
     "桃花潭水深千尺，不及汪伦送我情。", "《赠汪伦》"),
    ("荷花", "芙蓉、芙蕖、水芝、玉环",
     "ดอกบัว",
     "镜湖三百里，菡萏发荷花。", "《子夜吴歌·夏歌》"),
    ("", "", "",
     "涉江玩秋水，爱此红蕖鲜。", "《折荷有赠》"),
    ("梅", "疏影、暗香、冰魂、驿使",
     "ดอกเหมย / ต้นเหมย",
     "闻道春还未相识，走傍寒梅访消息。", "《早春寄王汉阳》"),
    ("雨", "银竹、甘霖、膏泽、跳珠",
     "ฝน",
     "东风洒雨露，会入天地春。", "《送郄昂谪巴中》"),
    ("", "", "",
     "白雨映寒山，森然似银竹。", "《宿虾湖》"),
    ("雷", "天鼓、霹雳、霆",
     "ฟ้าร้อง / สายฟ้า",
     "雷公砰訇震天鼓，帝旁投壶多玉女。", "《梁甫吟》"),
    ("彩虹", "天虹、虹霓、彩霓、玉桥",
     "รุ้งกินน้ำ",
     "安得五彩虹，架天作长桥。", "《焦山望松寥山》"),
]

artifact_data = [
    ("酒", "杜康、琼浆、玉液、杯中物、忘忧物",
     "เหล้า / สุรา",
     "五花马，千金裘，呼儿将出换美酒。", "《将进酒》"),
    ("剑", "三尺、龙泉、太阿、吴钩、霜锋",
     "กระบี่ / ดาบ",
     "长剑一杯酒，男儿方寸心。", "《赠崔侍郎》"),
    ("", "", "",
     "愿将腰下剑，直为斩楼兰。", "《塞下曲·其一》"),
]

# ── Title ──
title = doc.add_paragraph()
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = title.add_run("李白诗歌意象总表（含泰语别称）")
run.bold = True
run.font.size = Pt(18)
run.font.color.rgb = RGBColor(0x1F, 0x49, 0x7D)

# Subtitle
sub = doc.add_paragraph()
sub.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = sub.add_run("按动物、自然景物、人文器物三大类排列 · 新增泰语别称列")
run.font.size = Pt(10)
run.font.color.rgb = RGBColor(0x59, 0x56, 0x59)

doc.add_paragraph()  # spacer

def fill_category(doc, cat_name, cat_short, data, table_num=None):
    """Add a category title and table to the document."""
    # Category heading
    h = doc.add_paragraph()
    run = h.add_run(f"{cat_name}")
    run.bold = True
    run.font.size = Pt(13)
    run.font.color.rgb = RGBColor(0x1F, 0x49, 0x7D)

    cols = 5  # 意象 | 别称/雅称/代称 | 泰语别称 | 例句 | 出处
    table = doc.add_table(rows=1, cols=cols)
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER

    # Set column widths
    widths = [Cm(2.8), Cm(4.5), Cm(3.5), Cm(10.5), Cm(3.5)]
    for i, w in enumerate(widths):
        for row in table.rows:
            row.cells[i].width = w

    # Header
    make_header_row(table, ["意象", "中文别称/雅称/代称", "泰语别称", "例句", "出处"])

    # Data rows
    for img, alt_names, thai_names, example, source in data:
        row = table.add_row()
        # Set cell widths
        for i, w in enumerate(widths):
            row.cells[i].width = w

        # Fill cells
        cell_data = [img, alt_names, thai_names, example, source]
        for i, val in enumerate(cell_data):
            cell = row.cells[i]
            cell.text = ""
            p = cell.paragraphs[0]
            run = p.add_run(val)
            run.font.size = Pt(8)

            # Bold the image name if present
            if i == 0 and val:
                run.bold = True

            # Left-align, except Thai column and source
            if i in (0, 1, 2):
                p.alignment = WD_ALIGN_PARAGRAPH.LEFT
            elif i == 3:
                p.alignment = WD_ALIGN_PARAGRAPH.LEFT
            else:
                p.alignment = WD_ALIGN_PARAGRAPH.LEFT

    # Add spacing after table
    doc.add_paragraph()

# Fill each category
fill_category(doc, "一、动物意象", "动物", animal_data)
fill_category(doc, "二、自然景物意象", "自然", nature_data)
fill_category(doc, "三、人文 / 器物意象", "人文", artifact_data)

# ── Usage Tips Section ──
h = doc.add_paragraph()
run = h.add_run("使用提示")
run.bold = True
run.font.size = Pt(13)
run.font.color.rgb = RGBColor(0x1F, 0x49, 0x7D)

tips = [
    ('1. 李白本人高频使用的别称：',
     '在写月时，李白几乎把神话别称用了个遍——\u201c白玉盘\u201d\u201c瑶台镜\u201d\u201c白兔\u201d\u201c蟾蜍\u201d\u201c阴精\u201d\u201c大明\u201d（均见《古朗月行》《把酒问月》）；写雨用\u201c银竹\u201d（《宿虾湖》），写雷用\u201c天鼓\u201d（《梁甫吟》），这些都是极具李白个人特色的用词。'),
    ('2. 按主题快速归类：',
     '仙道游侠：大鹏、龙、白鹿、青鸟、玉兔、素娥、桂魄、蟾蜍、青牛、巨鳌、沧溟、芙蓉\n'
     '离别思乡：子规（杜鹃）、鸿雁（雁字）、柳（章台、灞岸）、孤帆（兰舟、一叶）\n'
     '边塞豪侠：马（龙媒、天马）、剑（三尺、吴钩、霜锋）、霜（青女）'),
    ('3. 注意区分：',
     '别称分为代称（如\u201c杜康\u201d代酒、\u201c青女\u201d代霜）和形态雅称（如\u201c六出\u201d代雪、\u201c玉弓\u201d代月），在赏析时可分别按\u201c借代\u201d和\u201c比喻\u201d两种修辞来分析。'),
    ('4. 泰语别称说明：',
     '泰语别称列中，常用意象给出标准泰语名称；中国古典文学特有的雅称/代称（如\u201c青女\u201d代霜、\u201c六出\u201d代雪）在泰语中无对应表达，故保留空缺或给出基本概念翻译。'
     '李白诗句例句未译，保留原貌。'),
]

for title, content in tips:
    p = doc.add_paragraph()
    run = p.add_run(title)
    run.bold = True
    run.font.size = Pt(9)
    p2 = doc.add_paragraph()
    run2 = p2.add_run(content)
    run2.font.size = Pt(9)
    p2.paragraph_format.left_indent = Cm(0.5)

# Save
output_path = "/root/.openclaw/media/outbound/李白诗歌意象总表（含泰语别称）.docx"
doc.save(output_path)
print(f"Saved to: {output_path}")
