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

# ==================== 数据管理 ====================
DATA_FILE = "tang_poetry.json"
SAMPLE_DATA = [
    {"title": "静夜思", "author": "李白", "dynasty": "唐代", "content": "床前明月光，疑是地上霜。\n举头望明月，低头思故乡。", "tags": ["五言绝句", "思乡"]},
    {"title": "春晓", "author": "孟浩然", "dynasty": "唐代", "content": "春眠不觉晓，处处闻啼鸟。\n夜来风雨声，花落知多少。", "tags": ["五言绝句", "春天"]},
    {"title": "登鹳雀楼", "author": "王之涣", "dynasty": "唐代", "content": "白日依山尽，黄河入海流。\n欲穷千里目，更上一层楼。", "tags": ["五言绝句", "哲理"]}
]

def load_poems():
    if not os.path.exists(DATA_FILE):
        with open(DATA_FILE, "w", encoding="utf-8") as f:
            json.dump(SAMPLE_DATA, f, ensure_ascii=False, indent=2)
        return SAMPLE_DATA
    with open(DATA_FILE, "r", encoding="utf-8") as f:
        return json.load(f)

# ==================== GUI 主程序 ====================
class TangPoetryApp:
    # 古典配色方案
    BG_COLOR = "#FDF5E6"      # 旧纸色背景
    FG_COLOR = "#4A3728"      # 深褐文字
    ACCENT_COLOR = "#8B4513"  # 赭石强调色
    BTN_COLOR = "#D2B48C"     # 按钮色
    
    def __init__(self, root):
        self.root = root
        self.root.title("📜 唐诗三百首")
        self.root.geometry("700x600")
        self.root.configure(bg=self.BG_COLOR)
        self.root.minsize(500, 400)
        
        self.poems = load_poems()
        self.filtered_poems = self.poems.copy()
        
        self._build_ui()
        self._refresh_list()
        
    def _build_ui(self):
        # ---------- 顶部搜索栏 ----------
        top_frame = tk.Frame(self.root, bg=self.BG_COLOR)
        top_frame.pack(fill="x", padx=20, pady=(15, 5))
        
        tk.Label(top_frame, text="🔍", font=("Microsoft YaHei", 14), bg=self.BG_COLOR).pack(side="left")
        self.search_var = tk.StringVar()
        search_entry = tk.Entry(top_frame, textvariable=self.search_var, font=("Microsoft YaHei", 12),
                                relief="flat", bg="#FFF8DC", fg=self.FG_COLOR)
        search_entry.pack(side="left", fill="x", expand=True, padx=(5, 10), ipady=4)
        search_entry.bind("<Return>", lambda e: self._do_search())
        
        btn_style = {"font": ("Microsoft YaHei", 10), "bg": self.ACCENT_COLOR, 
                     "fg": "white", "relief": "flat", "cursor": "hand2", "padx": 12}
        tk.Button(top_frame, text="搜索", command=self._do_search, **btn_style).pack(side="left", padx=2)
        tk.Button(top_frame, text="随机", command=self._random_poem, **btn_style).pack(side="left", padx=2)
        tk.Button(top_frame, text="重置", command=self._reset_search, 
                  font=("Microsoft YaHei", 10), bg=self.BTN_COLOR, fg=self.FG_COLOR, 
                  relief="flat", cursor="hand2", padx=12).pack(side="left", padx=2)
        
        # ---------- 诗词列表 (Treeview) ----------
        list_frame = tk.Frame(self.root, bg=self.BG_COLOR)
        list_frame.pack(fill="both", expand=True, padx=20, pady=10)
        
        style = ttk.Style()
        style.theme_use("clam")
        style.configure("Poetry.Treeview", background="#FFF8DC", foreground=self.FG_COLOR,
                        fieldbackground="#FFF8DC", font=("Microsoft YaHei", 11), rowheight=30)
        style.configure("Poetry.Treeview.Heading", background=self.ACCENT_COLOR, 
                        foreground="white", font=("Microsoft YaHei", 10, "bold"))
        style.map("Poetry.Treeview", background=[("selected", "#DEB887")], foreground=[("selected", "#4A3728")])
        
        columns = ("title", "author", "dynasty")
        self.tree = ttk.Treeview(list_frame, columns=columns, show="headings", 
                                 style="Poetry.Treeview", selectmode="browse")
        self.tree.heading("title", text="标题")
        self.tree.heading("author", text="作者")
        self.tree.heading("dynasty", text="朝代")
        self.tree.column("title", width=200, anchor="center")
        self.tree.column("author", width=120, anchor="center")
        self.tree.column("dynasty", width=80, anchor="center")
        
        scrollbar = ttk.Scrollbar(list_frame, orient="vertical", command=self.tree.yview)
        self.tree.configure(yscrollcommand=scrollbar.set)
        self.tree.pack(side="left", fill="both", expand=True)
        scrollbar.pack(side="right", fill="y")
        
        self.tree.bind("<<TreeviewSelect>>", self._on_select)
        
        # ---------- 底部详情区 ----------
        detail_frame = tk.Frame(self.root, bg="#FFF8DC", relief="groove", bd=1)
        detail_frame.pack(fill="x", padx=20, pady=(0, 15), ipady=10)
        
        self.detail_label = tk.Label(detail_frame, text="👆 点击上方诗词查看详情", 
                                     font=("KaiTi", 14), bg="#FFF8DC", fg=self.ACCENT_COLOR,
                                     justify="center", wraplength=640)
        self.detail_label.pack(padx=15, pady=10)
        
        # 状态栏
        self.status_var = tk.StringVar(value=f"共加载 {len(self.poems)} 首诗词")
        tk.Label(self.root, textvariable=self.status_var, font=("Microsoft YaHei", 9),
                 bg=self.BG_COLOR, fg="#999").pack(anchor="w", padx=20, pady=(0, 8))
    
    # ---------- 功能方法 ----------
    def _refresh_list(self):
        self.tree.delete(*self.tree.get_children())
        for p in self.filtered_poems:
            self.tree.insert("", "end", values=(p["title"], p["author"], p.get("dynasty", "")))
        self.status_var.set(f"显示 {len(self.filtered_poems)} / {len(self.poems)} 首")
    
    def _do_search(self):
        kw = self.search_var.get().strip()
        if not kw:
            self.filtered_poems = self.poems
        else:
            self.filtered_poems = [p for p in self.poems if 
                                   kw in p["title"] or kw in p["author"] or 
                                   kw in p["content"] or kw in p.get("dynasty", "")]
        self._refresh_list()
        if not self.filtered_poems:
            self.detail_label.config(text=f"😔 未找到与「{kw}」相关的诗词")
    
    def _reset_search(self):
        self.search_var.set("")
        self.filtered_poems = self.poems
        self._refresh_list()
        self.detail_label.config(text="👆 点击上方诗词查看详情")
    
    def _random_poem(self):
        poem = random.choice(self.poems)
        self._show_detail(poem)
        # 高亮对应行
        for item in self.tree.get_children():
            if self.tree.item(item)["values"][0] == poem["title"]:
                self.tree.selection_set(item)
                self.tree.see(item)
                break
    
    def _on_select(self, event):
        sel = self.tree.selection()
        if not sel:
            return
        title = self.tree.item(sel[0])["values"][0]
        poem = next((p for p in self.poems if p["title"] == title), None)
        if poem:
            self._show_detail(poem)
    
    def _show_detail(self, poem):
        tags = ", ".join(poem.get("tags", []))
        content = poem["content"].replace("\n", "\n\n")
        text = (f"《{poem['title']}》\n"
                f"【{poem.get('dynasty', '')}】{poem['author']}\n\n"
                f"{content}\n\n"
                f"🏷️ {tags}")
        self.detail_label.config(text=text, font=("KaiTi", 14))

# ==================== 启动 ====================
if __name__ == "__main__":
    root = tk.Tk()
    # Windows下设置DPI感知，避免模糊
    try:
        from ctypes import windll
        windll.shcore.SetProcessDpiAwareness(1)
    except Exception:
        pass
    
    app = TangPoetryApp(root)
    root.mainloop()
