import tkinter as tk
from tkinter import ttk, font
import random

# ---------- 诗歌数据：10 首示例 ----------
POEMS = [
    {
        "title": "静夜思",
        "author": "李白",
        "dynasty": "唐",
        "content": "床前明月光，疑是地上霜。举头望明月，低头思故乡。"
    },
    {
        "title": "春晓",
        "author": "孟浩然",
        "dynasty": "唐",
        "content": "春眠不觉晓，处处闻啼鸟。夜来风雨声，花落知多少。"
    },
    {
        "title": "望庐山瀑布",
        "author": "李白",
        "dynasty": "唐",
        "content": "日照香炉生紫烟，遥看瀑布挂前川。飞流直下三千尺，疑是银河落九天。"
    },
    {
        "title": "黄鹤楼送孟浩然之广陵",
        "author": "李白",
        "dynasty": "唐",
        "content": "故人西辞黄鹤楼，烟花三月下扬州。孤帆远影碧空尽，唯见长江天际流。"
    },
    {
        "title": "登鹳雀楼",
        "author": "王之涣",
        "dynasty": "唐",
        "content": "白日依山尽，黄河入海流。欲穷千里目，更上一层楼。"
    },
    {
        "title": "送元二使安西",
        "author": "王维",
        "dynasty": "唐",
        "content": "渭城朝雨浥轻尘，客舍青青柳色新。劝君更尽一杯酒，西出阳关无故人。"
    },
    {
        "title": "山居秋暝",
        "author": "王维",
        "dynasty": "唐",
        "content": "空山新雨后，天气晚来秋。明月松间照，清泉石上流。竹喧归浣女，莲动下渔舟。随意春芳歇，王孙自可留。"
    },
    {
        "title": "九月九日忆山东兄弟",
        "author": "王维",
        "dynasty": "唐",
        "content": "独在异乡为异客，每逢佳节倍思亲。遥知兄弟登高处，遍插茱萸少一人。"
    },
    {
        "title": "鹿柴",
        "author": "王维",
        "dynasty": "唐",
        "content": "空山不见人，但闻人语响。返景入深林，复照青苔上。"
    },
    {
        "title": "相思",
        "author": "王维",
        "dynasty": "唐",
        "content": "红豆生南国，春来发几枝。愿君多采撷，此物最相思。"
    },
]

# ---------- 应用主类 ----------
class BambooPoetryApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("竹韵·唐诗三百首（示例10首）")
        self.geometry("1000x650")
        self.minsize(800, 500)
        self.configure(bg="#f3f7f1")

        # 字体：可根据系统修改
        default_family = "Microsoft YaHei"  # Windows 上常见中文字体，可改为 SimSun/Noto Serif 等
        self.title_font = font.Font(family=default_family, size=18, weight="bold")
        self.meta_font = font.Font(family=default_family, size=12, slant="italic")
        self.list_font = font.Font(family=default_family, size=12)
        self.content_font = font.Font(family=default_family, size=16)

        # 数据
        self.poems = POEMS.copy()
        self.filtered = list(self.poems)

        # UI 构建
        self._create_widgets()
        # 绘制竹子背景装饰
        self._draw_bamboo_background()

        self.bind("<Configure>", lambda e: self._draw_bamboo_background())

    def _create_widgets(self):
        # 顶部：搜索 与 字号
        top = ttk.Frame(self)
        top.pack(side="top", fill="x", padx=12, pady=8)

        lbl = ttk.Label(top, text="搜索：")
        lbl.pack(side="left")

        self.search_var = tk.StringVar()
        ent = ttk.Entry(top, textvariable=self.search_var)
        ent.pack(side="left", fill="x", expand=True, padx=(6,6))
        ent.bind("<KeyRelease>", self._on_search)

        sz_lbl = ttk.Label(top, text="字号：")
        sz_lbl.pack(side="left", padx=(6,0))
        self.size_var = tk.IntVar(value=16)
        size_cb = ttk.Combobox(top, textvariable=self.size_var, values=(14,16,18,20,22), width=4)
        size_cb.pack(side="left")
        size_cb.bind("<<ComboboxSelected>>", self._on_size_change)

        # 主体区域：左侧目录/列表，中间为诗列表，右侧为详情（这里把目录与列表合并在左侧）
        main = ttk.Frame(self)
        main.pack(fill="both", expand=True, padx=12, pady=(0,12))

        # 用 Canvas 放背景与内容
        self.canvas = tk.Canvas(main, bg="#f6fbf6", highlightthickness=0)
        self.canvas.pack(fill="both", expand=True)
        self.canvas.update_idletasks()

        # 左侧目录区（固定宽）
        left_frame = ttk.Frame(self.canvas)
        # 目录：按作者分组的 Treeview（可展开）
        ttk.Label(left_frame, text="目录（作者分组）", font=self.meta_font).pack(anchor="w", padx=6, pady=(6,0))
        self.tree = ttk.Treeview(left_frame, show="tree")
        self.tree.pack(fill="both", expand=True, padx=6, pady=6)
        self.tree.bind("<<TreeviewSelect>>", self._on_tree_select)

        # 中间列表（按搜索或目录筛选）
        middle_frame = ttk.Frame(self.canvas)
        ttk.Label(middle_frame, text="诗列表", font=self.meta_font).pack(anchor="w", padx=6, pady=(6,0))
        self.listbox = tk.Listbox(middle_frame, font=self.list_font, activestyle='none')
        self.listbox.pack(side="left", fill="both", expand=True, padx=(6,0), pady=6)
        self.listbox.bind("<<ListboxSelect>>", self._on_list_select)
        mscroll = ttk.Scrollbar(middle_frame, orient="vertical", command=self.listbox.yview)
        mscroll.pack(side="right", fill="y", padx=(0,6), pady=6)
        self.listbox.config(yscrollcommand=mscroll.set)

        # 右侧详情
        right_frame = ttk.Frame(self.canvas)
        # 标题
        self.title_label = ttk.Label(right_frame, text="", font=self.title_font, anchor="center")
        self.title_label.pack(fill="x", pady=(8,4))
        # 作者与朝代
        self.meta_label = ttk.Label(right_frame, text="", font=self.meta_font, anchor="center")
        self.meta_label.pack(fill="x", pady=(0,8))
        # 内容 Text
        self.content_text = tk.Text(right_frame, wrap="word", font=self.content_font, bg="#fffef9", relief="flat")
        self.content_text.pack(fill="both", expand=True, padx=8, pady=8)
        self.content_text.config(state="disabled")

        # 将三个部分放在 canvas 中（以便背景竹子在其后）
        self.left_win = self.canvas.create_window(12, 12, anchor="nw", window=left_frame, width=220, height=520)
        self.mid_win = self.canvas.create_window(248, 12, anchor="nw", window=middle_frame, width=260, height=520)
        self.right_win = self.canvas.create_window(520, 12, anchor="nw", window=right_frame, width=440, height=520)

        # 填充目录与列表
        self._populate_tree()
        self._refresh_list()

        # 绑定窗口大小改变以调整子窗体尺寸与重绘竹子
        self.bind("<Configure>", self._on_resize)

    def _populate_tree(self):
        # 根据作者分组（作者 -> 该作者的诗）
        self.tree.delete(*self.tree.get_children())
        authors = {}
        for idx, p in enumerate(self.poems):
            authors.setdefault(p['author'], []).append((idx, p))
        for author, items in sorted(authors.items()):
            parent = self.tree.insert("", "end", text=author)
            for idx, p in items:
                # 子节点 id 使用 idx，以便后续查找
                self.tree.insert(parent, "end", iid=f"poem_{idx}", text=p['title'])

    def _refresh_list(self):
        # 刷新中间列表，根据 self.filtered
        self.listbox.delete(0, tk.END)
        for idx, p in enumerate(self.filtered):
            self.listbox.insert(tk.END, f"{p['title']} — {p['author']}")
        if self.filtered:
            self.listbox.selection_set(0)
            self._show_poem_by_obj(self.filtered[0])
        else:
            self._clear_detail()

    def _on_search(self, event=None):
        q = self.search_var.get().strip().lower()
        if not q:
            self.filtered = list(self.poems)
        else:
            res = []
            for p in self.poems:
                if (q in p['title'].lower() or q in p['author'].lower() or
                        q in p['dynasty'].lower() or q in p['content'].lower()):
                    res.append(p)
            self.filtered = res
        self._refresh_list()

    def _on_tree_select(self, event=None):
        sel = self.tree.selection()
        if not sel:
            return
        # 如果选中的是诗节点（iid 以 poem_ 开头），直接显示；若是作者节点，列出该作者的诗
        sel_id = sel[0]
        if sel_id.startswith("poem_"):
            idx = int(sel_id.split("_",1)[1])
            p = self.poems[idx]
            # 让中间列表选择对应的项（如果在 filtered 中）
            for i, fp in enumerate(self.filtered):
                if fp is p:
                    self.listbox.selection_clear(0, tk.END)
                    self.listbox.selection_set(i)
                    self.listbox.see(i)
                    self._show_poem_by_obj(p)
                    return
            # 若不在当前 filtered，则直接显示并清除 selection
            self._show_poem_by_obj(p)
        else:
            # 作者节点：筛选列表为该作者
            author = self.tree.item(sel_id, "text")
            self.filtered = [p for p in self.poems if p['author'] == author]
            self._refresh_list()

    def _on_list_select(self, event=None):
        sel = self.listbox.curselection()
        if not sel:
            return
        idx = sel[0]
        p = self.filtered[idx]
        self._show_poem_by_obj(p)

    def _show_poem_by_obj(self, p):
        self.title_label.config(text=p['title'])
        self.meta_label.config(text=f"{p['author']}（{p['dynasty']}）")
        # 准备美化显示：按句换行
        cont = p['content'].replace("。", "。\n").replace("，", "，\n")
        lines = [ln.strip() for ln in cont.splitlines() if ln.strip()]
        pretty = "\n".join(lines)
        self.content_text.config(state="normal")
        self.content_text.delete("1.0", tk.END)
        self.content_text.insert("1.0", pretty)
        # 调整字号
        self.content_font.configure(size=self.size_var.get())
        self.content_text.config(state="disabled")

    def _clear_detail(self):
        self.title_label.config(text="")
        self.meta_label.config(text="")
        self.content_text.config(state="normal")
        self.content_text.delete("1.0", tk.END)
        self.content_text.config(state="disabled")

    def _on_size_change(self, event=None):
        self.content_font.configure(size=self.size_var.get())

    def _on_resize(self, event=None):
        # 调整 canvas 上子窗口尺寸
        canvas_w = self.canvas.winfo_width()
        canvas_h = self.canvas.winfo_height()
        left_w = 220
        mid_w = max(220, int(canvas_w * 0.26))
        right_w = max(360, canvas_w - left_w - mid_w - 40)
        left_h = max(200, canvas_h - 24)
        mid_h = left_h
        right_h = left_h
        self.canvas.coords(self.left_win, 12, 12)
        self.canvas.itemconfig(self.left_win, width=left_w, height=left_h)
        self.canvas.coords(self.mid_win, 12 + left_w + 8, 12)
        self.canvas.itemconfig(self.mid_win, width=mid_w, height=mid_h)
        self.canvas.coords(self.right_win, 12 + left_w + 8 + mid_w + 8, 12)
        self.canvas.itemconfig(self.right_win, width=right_w, height=right_h)
        # 重新绘制竹子装饰
        self._draw_bamboo_background()

    def _draw_bamboo_background(self):
        # 在 canvas 上绘制简洁的竹子元素作为装饰（不遮挡控件）
        self.canvas.delete("bamboo_bg")
        w = self.canvas.winfo_width()
        h = self.canvas.winfo_height()
        if w <=0 or h <=0:
            return
        # 轻色底（模拟宣纸）
        self.canvas.create_rectangle(0, 0, w, h, fill="#fbfbf6", outline="", tags=("bamboo_bg",))
        # 在左右两侧绘制几丛竹子（用多段线+椭圆叶子表示）
        

if __name__ == "__main__":
    app = BambooPoetryApp()
    app.mainloop()