#!/usr/bin/env python3
# -*- coding: utf-8 -*-

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

# ---- 这里内置少量示例诗歌，实际可替换为完整数据 ----
# 数据格式：列表，每项为 dict: {'title':..., 'author':..., 'content': '多行字符串'}
SAMPLE_POEMS = [
    {
        "title": "静夜思",
        "author": "李白",
        "content": "床前明月光，疑是地上霜。\n举头望明月，低头思故乡。"
    },
    {
        "title": "春晓",
        "author": "孟浩然",
        "content": "春眠不觉晓，处处闻啼鸟。\n夜来风雨声，花落知多少。"
    },
    {
        "title": "黄鹤楼送孟浩然之广陵",
        "author": "李白",
        "content": "故人西辞黄鹤楼，烟花三月下扬州。\n孤帆远影碧空尽，唯见长江天际流。"
    },
    {
        "title": "登鹳雀楼",
        "author": "王之涣",
        "content": "白日依山尽，黄河入海流。\n欲穷千里目，更上一层楼。"
    }
]

# 可改为读取本地 json 文件（若你有完整诗集）
def load_poems_from_file(path):
    try:
        with open(path, 'r', encoding='utf-8') as f:
            data = json.load(f)
            # 期望 data 为列表，项为 {'title','author','content'}
            return data
    except Exception as e:
        messagebox.showerror("加载失败", f"加载诗集出错: {e}")
        return None

class TangShiApp(tk.Tk):
    def __init__(self, poems):
        super().__init__()
        self.title("唐诗三百首（示例）")
        self.geometry("800x600")
        self.poems = poems[:]  # 列表副本
        self.index = 0

        # 顶部搜索区
        top_frame = ttk.Frame(self)
        top_frame.pack(fill='x', padx=8, pady=6)

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

        ttk.Button(top_frame, text="按题目/作者搜索", command=self.do_search).pack(side='left', padx=4)
        ttk.Button(top_frame, text="随机一首", command=self.random_poem).pack(side='left', padx=4)
        ttk.Button(top_frame, text="全部显示", command=self.show_all).pack(side='left', padx=4)

        ttk.Button(top_frame, text="加载 JSON 文件...", command=self.load_json_file).pack(side='right')

        # 中间显示区：标题、作者、内容
        middle = ttk.Frame(self)
        middle.pack(fill='both', expand=True, padx=8, pady=6)

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

        self.author_label = ttk.Label(middle, text="", font=("Helvetica", 12))
        self.author_label.pack(anchor='w', pady=(0,6))

        self.text_area = scrolledtext.ScrolledText(middle, wrap='word', font=("Song", 14))
        self.text_area.pack(fill='both', expand=True)
        self.text_area.configure(state='disabled')  # 只读

        # 底部控制区：翻页等
        bottom = ttk.Frame(self)
        bottom.pack(fill='x', padx=8, pady=6)

        ttk.Button(bottom, text="上一首", command=self.prev_poem).pack(side='left')
        ttk.Button(bottom, text="下一首", command=self.next_poem).pack(side='left', padx=4)
        ttk.Button(bottom, text="保存为文本...", command=self.save_current_to_file).pack(side='right')

        # 列表区（右侧）显示所有标题，支持选择
        right = ttk.Frame(self)
        right.place(relx=0.7, rely=0.06, relwidth=0.28, relheight=0.88)  # 使用绝对布局方便示例

        ttk.Label(right, text="诗列表").pack(anchor='w', padx=4, pady=(4,0))
        self.listbox = tk.Listbox(right)
        self.listbox.pack(fill='both', expand=True, padx=4, pady=4)
        self.listbox.bind("<<ListboxSelect>>", self.on_list_select)

        # 初始化列表并显示第一首
        self.refresh_listbox()
        if self.poems:
            self.show_poem(0)

    def refresh_listbox(self):
        self.listbox.delete(0, tk.END)
        for i, p in enumerate(self.poems):
            title = p.get('title', f'（无题）#{i}')
            author = p.get('author', '')
            self.listbox.insert(tk.END, f"{title} — {author}")

    def show_poem(self, idx):
        if not self.poems:
            self.title_label.config(text="无诗歌")
            self.author_label.config(text="")
            self.text_area.configure(state='normal')
            self.text_area.delete('1.0', tk.END)
            self.text_area.configure(state='disabled')
            return
        idx = max(0, min(idx, len(self.poems)-1))
        self.index = idx
        p = self.poems[idx]
        self.title_label.config(text=p.get('title',''))
        self.author_label.config(text=p.get('author',''))
        self.text_area.configure(state='normal')
        self.text_area.delete('1.0', tk.END)
        self.text_area.insert(tk.END, p.get('content',''))
        self.text_area.configure(state='disabled')
        # 更新列表选中
        try:
            self.listbox.selection_clear(0, tk.END)
            self.listbox.selection_set(idx)
            self.listbox.see(idx)
        except Exception:
            pass

    def prev_poem(self):
        if not self.poems: return
        self.show_poem((self.index - 1) % len(self.poems))

    def next_poem(self):
        if not self.poems: return
        self.show_poem((self.index + 1) % len(self.poems))

    def random_poem(self):
        if not self.poems: return
        self.show_poem(random.randrange(len(self.poems)))

    def do_search(self):
        key = self.search_var.get().strip()
        if not key:
            messagebox.showinfo("提示", "请输入搜索关键字（题目或作者）")
            return
        key_lower = key.lower()
        results = [p for p in SAMPLE_POEMS if key_lower in (p.get('title','').lower() + p.get('author','').lower())]
        if not results:
            messagebox.showinfo("未找到", f"未找到包含“{key}”的诗")
            return
        # 用搜索结果替换当前诗列表（保留原始 SAMPLE_POEMS 未改动）
        self.poems = results
        self.refresh_listbox()
        self.show_poem(0)

    def show_all(self):
        # 若之前用了 load 的文件则 self.full_poems 指向原始全量数据，否则恢复 SAMPLE_POEMS
        if hasattr(self, 'full_poems') and self.full_poems:
            self.poems = self.full_poems[:]
        else:
            self.poems = SAMPLE_POEMS[:]
        self.refresh_listbox()
        if self.poems:
            self.show_poem(0)

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

    def save_current_to_file(self):
        if not self.poems:
            messagebox.showinfo("提示", "当前没有诗可保存")
            return
        p = self.poems[self.index]
        default_name = (p.get('title') or 'poem') + ".txt"
        path = filedialog.asksaveasfilename(defaultextension=".txt", initialfile=default_name,
                                            filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")])
        if not path:
            return
        try:
            with open(path, 'w', encoding='utf-8') as f:
                f.write(f"{p.get('title','')}\n{p.get('author','')}\n\n{p.get('content','')}\n")
            messagebox.showinfo("保存成功", f"已保存到 {path}")
        except Exception as e:
            messagebox.showerror("保存失败", str(e))

    def load_json_file(self):
        path = filedialog.askopenfilename(title="选择 JSON 诗集文件", filetypes=[("JSON 文件","*.json"),("所有文件","*.*")])
        if not path:
            return
        data = load_poems_from_file(path)
        if not data:
            return
        # 简单校验
        ok_list = []
        for item in data:
            if isinstance(item, dict) and 'title' in item and 'content' in item:
                ok_list.append(item)
        if not ok_list:
            messagebox.showerror("错误", "文件中不包含合法诗歌数据（期望列表，每项包含 title 与 content）")
            return
        self.full_poems = ok_list[:]  # 保存原始全量
        self.poems = ok_list[:]
        self.refresh_listbox()
        self.show_poem(0)
        messagebox.showinfo("加载成功", f"已加载 {len(self.poems)} 首诗歌")

if __name__ == "__main__":
    # 若你有本地 JSON 文件可以改为 load_poems_from_file('tang300.json')
    poems = SAMPLE_POEMS[:]
    app = TangShiApp(poems)
    app.mainloop()