import tkinter as tk
from tkinter import ttk, messagebox
import json
import os

class TangPoemApp:
    def __init__(self, root):
        self.root = root
        self.root.title("唐诗三百首 - 简易阅读器")
        self.root.geometry("800x600")
        
        # 数据初始化
        self.poems = self.load_data()
        self.filtered_poems = self.poems.copy()
        
        self.create_widgets()
        self.populate_list()
        
    def load_data(self):
        """
        尝试从 300.json 加载数据，如果文件不存在则返回内置的示例数据。
        你可以去 GitHub 下载标准的 300.json 数据文件放在同目录下[citation:2]。
        """
        file_path = "300.json"
        if os.path.exists(file_path):
            try:
                with open(file_path, "r", encoding="utf-8") as f:
                    return json.load(f)
            except Exception as e:
                messagebox.showwarning("数据加载失败", f"读取 300.json 出错：{e}。将使用内置示例数据。")
        
        # 内置备用示例数据
        return [
            {
                "title": "静夜思",
                "author": "李白",
                "type": "五言绝句",
                "contents": "床前明月光，疑是地上霜。\n举头望明月，低头思故乡。"
            },
            {
                "title": "登鹳雀楼",
                "author": "王之涣",
                "type": "五言绝句",
                "contents": "白日依山尽，黄河入海流。\n欲穷千里目，更上一层楼。"
            },
            {
                "title": "春晓",
                "author": "孟浩然",
                "type": "五言绝句",
                "contents": "春眠不觉晓，处处闻啼鸟。\n夜来风雨声，花落知多少。"
            },
            {
                "title": "相思",
                "author": "王维",
                "type": "五言绝句",
                "contents": "红豆生南国，春来发几枝。\n愿君多采撷，此物最相思。"
            }
        ]

    def create_widgets(self):
        # 左侧面板：搜索和列表
        left_frame = tk.Frame(self.root, width=250, bg="#f0f0f0")
        left_frame.pack(side=tk.LEFT, fill=tk.Y)
        left_frame.pack_propagate(False)
        
        # 搜索框
        search_frame = tk.Frame(left_frame, bg="#f0f0f0")
        search_frame.pack(fill=tk.X, padx=10, pady=10)
        
        tk.Label(search_frame, text="搜索：", bg="#f0f0f0").pack(side=tk.LEFT)
        self.search_var = tk.StringVar()
        self.search_var.trace("w", self.on_search)
        tk.Entry(search_frame, textvariable=self.search_var).pack(side=tk.LEFT, fill=tk.X, expand=True)
        
        # 诗歌列表
        list_frame = tk.Frame(left_frame)
        list_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        self.poem_listbox = tk.Listbox(list_frame, font=("微软雅黑", 11))
        scrollbar = tk.Scrollbar(list_frame, orient="vertical", command=self.poem_listbox.yview)
        self.poem_listbox.configure(yscrollcommand=scrollbar.set)
        
        self.poem_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
        self.poem_listbox.bind("<<ListboxSelect>>", self.on_poem_select)
        
        # 右侧面板：内容展示
        right_frame = tk.Frame(self.root, bg="white")
        right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
        
        # 标题和作者
        self.title_label = tk.Label(right_frame, text="选择一首诗", font=("微软雅黑", 18, "bold"), bg="white", anchor="w")
        self.title_label.pack(fill=tk.X, padx=30, pady=(30, 5))
        
        self.author_label = tk.Label(right_frame, text="", font=("微软雅黑", 12), fg="#666666", bg="white", anchor="w")
        self.author_label.pack(fill=tk.X, padx=30, pady=(0, 20))
        
        # 正文区域
        self.content_text = tk.Text(right_frame, wrap=tk.WORD, font=("楷体", 16), bg="white", relief=tk.FLAT, spacing1=5, spacing3=5)
        self.content_text.pack(fill=tk.BOTH, expand=True, padx=30, pady=(0, 30))
        self.content_text.config(state=tk.DISABLED) # 初始禁止编辑
        
    def populate_list(self):
        """刷新左侧列表"""
        self.poem_listbox.delete(0, tk.END)
        for poem in self.filtered_poems:
            display_text = f"{poem.get('title', '未知')} - {poem.get('author', '佚名')}"
            self.poem_listbox.insert(tk.END, display_text)
            
    def on_search(self, *args):
        """根据搜索词过滤列表"""
        keyword = self.search_var.get().strip()
        if not keyword:
            self.filtered_poems = self.poems.copy()
        else:
            self.filtered_poems = [
                p for p in self.poems 
                if keyword in p.get("title", "") or keyword in p.get("author", "") or keyword in p.get("contents", "")
            ]
        self.populate_list()
        
    def on_poem_select(self, event):
        """点击列表项时显示详情"""
        selection = self.poem_listbox.curselection()
        if not selection:
            return
        index = selection[0]
        poem = self.filtered_poems[index]
        
        self.title_label.config(text=poem.get("title", "无标题"))
        self.author_label.config(text=f"[{poem.get('author', '佚名')}] {poem.get('type', '')}")
        
        self.content_text.config(state=tk.NORMAL)
        self.content_text.delete(1.0, tk.END)
        # 简单的排版：去掉原始数据里可能存在的转义换行
        content = poem.get("contents", "").replace("\\n", "\n")
        self.content_text.insert(tk.END, content)
        self.content_text.config(state=tk.DISABLED)

if __name__ == "__main__":
    root = tk.Tk()
    app = TangPoemApp(root)
    root.mainloop()