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

# --- 示例数据：若干首唐诗（可以扩展） ---
# 每项为 dict 包含 title、author、content（list of lines）、notes（可选）
poems = [
    {
        "title": "静夜思",
        "author": "李白",
        "content": ["床前明月光，", "疑是地上霜。", "举头望明月，", "低头思故乡。"],
        "notes": "表达对故乡的思念。"
    },
    {
        "title": "登鹳雀楼",
        "author": "王之涣",
        "content": ["白日依山尽，", "黄河入海流。", "欲穷千里目，", "更上一层楼。"],
        "notes": "鼓励人们登高望远，志向远大。"
    },
    {
        "title": "春晓",
        "author": "孟浩然",
        "content": ["春眠不觉晓，", "处处闻啼鸟。", "夜来风雨声，", "花落知多少。"],
        "notes": "写春夜睡眠和春天景象。"
    },
    {
        "title": "黄鹤楼送孟浩然之广陵",
        "author": "李白",
        "content": ["故人西辞黄鹤楼，", "烟花三月下扬州。", "孤帆远影碧空尽，", "唯见长江天际流。"],
        "notes": "送别诗，写别离与景色。"
    },
    {
        "title": "相思",
        "author": "王维",
        "content": ["红豆生南国，", "春来发几枝。", "愿君多采撷，", "此物最相思。"],
        "notes": "借红豆抒发相思之情。"
    }
]

# --- 应用类 ---
class TangPoemsApp(tk.Tk):
    def __init__(self, poems):
        super().__init__()
        self.title("唐诗三百首（简易版）")
        self.geometry("900x600")
        self.poems = poems
        self.filtered = list(range(len(poems)))  # 索引列表
        self.current_index = 0

        self.create_widgets()
        self.populate_list()
        if self.filtered:
            self.select_by_index(0)

    def create_widgets(self):
        # 顶部：搜索框与按钮
        top_frame = ttk.Frame(self)
        top_frame.pack(side="top", fill="x", padx=8, pady=6)

        ttk.Label(top_frame, text="搜索：").pack(side="left")
        self.search_var = tk.StringVar()
        entry = ttk.Entry(top_frame, textvariable=self.search_var, width=40)
        entry.pack(side="left", padx=(0,6))
        entry.bind("<Return>", lambda e: self.do_search())

        ttk.Button(top_frame, text="搜索", command=self.do_search).pack(side="left")
        ttk.Button(top_frame, text="显示全部", command=self.show_all).pack(side="left", padx=6)
        ttk.Button(top_frame, text="随机一首", command=self.random_poem).pack(side="left")

        # 主体：左边列表 右边显示区
        main_pane = ttk.PanedWindow(self, orient="horizontal")
        main_pane.pack(fill="both", expand=True, padx=8, pady=6)

        left_frame = ttk.Frame(main_pane, width=260)
        main_pane.add(left_frame, weight=1)

        right_frame = ttk.Frame(main_pane)
        main_pane.add(right_frame, weight=3)

        # 左侧：诗题列表
        self.listbox = tk.Listbox(left_frame, exportselection=False)
        self.listbox.pack(side="left", fill="both", expand=True)
        self.listbox.bind("<<ListboxSelect>>", self.on_list_select)

        lb_scroll = ttk.Scrollbar(left_frame, orient="vertical", command=self.listbox.yview)
        lb_scroll.pack(side="right", fill="y")
        self.listbox.config(yscrollcommand=lb_scroll.set)

        # 右侧：标题、作者、内容、注释和控制按钮
        title_frame = ttk.Frame(right_frame)
        title_frame.pack(fill="x", pady=(0,4))

        self.title_label = ttk.Label(title_frame, text="", font=("Helvetica", 16, "bold"))
        self.title_label.pack(anchor="w")

        self.author_label = ttk.Label(title_frame, text="", font=("Helvetica", 12, "italic"))
        self.author_label.pack(anchor="w")

        content_frame = ttk.Frame(right_frame)
        content_frame.pack(fill="both", expand=True)

        self.text = tk.Text(content_frame, wrap="word", state="disabled", padx=8, pady=8)
        self.text.pack(fill="both", expand=True, side="left")

        text_scroll = ttk.Scrollbar(content_frame, orient="vertical", command=self.text.yview)
        text_scroll.pack(side="right", fill="y")
        self.text.config(yscrollcommand=text_scroll.set)

        bottom_frame = ttk.Frame(right_frame)
        bottom_frame.pack(fill="x", pady=(6,0))

        self.notes_var = tk.StringVar()
        ttk.Label(bottom_frame, textvariable=self.notes_var, foreground="gray").pack(side="left")

        btn_frame = ttk.Frame(bottom_frame)
        btn_frame.pack(side="right")

        ttk.Button(btn_frame, text="上一首", command=self.prev_poem).pack(side="left", padx=4)
        ttk.Button(btn_frame, text="下一首", command=self.next_poem).pack(side="left", padx=4)

    def populate_list(self):
        self.listbox.delete(0, "end")
        for idx in self.filtered:
            p = self.poems[idx]
            display = f"{p['title']} — {p['author']}"
            self.listbox.insert("end", display)

    def select_by_index(self, filtered_pos):
        if not self.filtered:
            return
        filtered_pos = max(0, min(filtered_pos, len(self.filtered)-1))
        self.current_index = self.filtered[filtered_pos]
        # 更新 listbox 选择
        self.listbox.select_clear(0, "end")
        self.listbox.select_set(filtered_pos)
        self.listbox.activate(filtered_pos)
        self.listbox.see(filtered_pos)
        self.show_poem(self.current_index)

    def on_list_select(self, event):
        sel = self.listbox.curselection()
        if not sel:
            return
        filtered_pos = sel[0]
        self.current_index = self.filtered[filtered_pos]
        self.show_poem(self.current_index)

    def show_poem(self, idx):
        poem = self.poems[idx]
        self.title_label.config(text=poem.get("title",""))
        self.author_label.config(text=poem.get("author",""))
        content = "".join(poem.get("content", []))
        # 显示内容
        self.text.config(state="normal")
        self.text.delete("1.0", "end")
        self.text.insert("end", content)
        self.text.config(state="disabled")
        # 注释
        notes = poem.get("notes","")
        self.notes_var.set(notes)

    def do_search(self):
        kw = self.search_var.get().strip()
        if not kw:
            self.show_all()
            return
        kw_lower = kw.lower()
        self.filtered = []
        for i, p in enumerate(self.poems):
            hay = (p.get("title","") + " " + p.get("author","") + " " + "".join(p.get("content","")) + " " + p.get("notes",""))
            if kw_lower in hay.lower():
                self.filtered.append(i)
        if not self.filtered:
            messagebox.showinfo("搜索结果", f"没有找到包含“{kw}”的诗。")
            return
        self.populate_list()
        self.select_by_index(0)

    def show_all(self):
        self.filtered = list(range(len(self.poems)))
        self.populate_list()
        if self.filtered:
            self.select_by_index(0)

    def random_poem(self):
        if not self.poems:
            return
        idx = random.randrange(len(self.poems))
        # 如果当前列表被过滤，找到这个 idx 在 filtered 中的位置（若存在），否则切换到全量
        if idx in self.filtered:
            pos = self.filtered.index(idx)
            self.select_by_index(pos)
        else:
            # 切换到全量并显示
            self.filtered = list(range(len(self.poems)))
            self.populate_list()
            pos = self.filtered.index(idx)
            self.select_by_index(pos)

    def prev_poem(self):
        if not self.filtered:
            return
        # 当前 current_index 是原始 poems 的索引，找到其在 filtered 中的位置
        try:
            pos = self.filtered.index(self.current_index)
        except ValueError:
            pos = 0
        pos = (pos - 1) % len(self.filtered)
        self.select_by_index(pos)

    def next_poem(self):
        if not self.filtered:
            return
        try:
            pos = self.filtered.index(self.current_index)
        except ValueError:
            pos = 0
        pos = (pos + 1) % len(self.filtered)
        self.select_by_index(pos)


if __name__ == "__main__":
    app = TangPoemsApp(poems)
    app.mainloop()



