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

class TangPoetryApp:
    def __init__(self, root):
        self.root = root
        self.root.title("唐诗三百首")
        self.root.geometry("900x650")
        self.root.configure(bg='#f5f5dc')  # 米色背景
        
        # 诗词数据
        self.poems = []
        self.load_poems_data()
        
        # 创建界面
        self.create_widgets()
        
        # 显示欢迎诗词
        if self.poems:
            self.show_random_poem()
    
    def load_poems_data(self):
        """加载诗词数据"""
        # 完整的诗词数据 - 每首诗都有不同的内容
        self.poems = [
            {
                "id": 1,
                "title": "静夜思",
                "author": "李白",
                "dynasty": "唐",
                "content": "床前明月光，\n疑是地上霜。\n举头望明月，\n低头思故乡。",
                "translation": "明亮的月光洒在床前，好像地上泛起了一层白霜。抬起头看天空的明月，不由得低头思念起故乡。"
            },
            {
                "id": 2,
                "title": "登鹳雀楼",
                "author": "王之涣",
                "dynasty": "唐",
                "content": "白日依山尽，\n黄河入海流。\n欲穷千里目，\n更上一层楼。",
                "translation": "夕阳依傍着西山慢慢沉没，滔滔黄河朝着东海汹涌奔流。若想把千里的风光景物看够，那就要登上更高的一层城楼。"
            },
            {
                "id": 3,
                "title": "春晓",
                "author": "孟浩然",
                "dynasty": "唐",
                "content": "春眠不觉晓，\n处处闻啼鸟。\n夜来风雨声，\n花落知多少。",
                "translation": "春夜睡得香甜，不觉天已亮了，到处是鸟儿清脆的叫声。回想昨夜的阵阵风雨声，不知吹落了多少花儿。"
            },
            {
                "id": 4,
                "title": "望庐山瀑布",
                "author": "李白",
                "dynasty": "唐",
                "content": "日照香炉生紫烟，\n遥看瀑布挂前川。\n飞流直下三千尺，\n疑是银河落九天。",
                "translation": "香炉峰在阳光的照射下生起紫色烟霞，远远望见瀑布似白色绢绸悬挂在山前。高崖上飞腾直落的瀑布好像有三千尺，让人恍惚以为银河从天上泻落到人间。"
            },
            {
                "id": 5,
                "title": "送孟浩然之广陵",
                "author": "李白",
                "dynasty": "唐",
                "content": "故人西辞黄鹤楼，\n烟花三月下扬州。\n孤帆远影碧空尽，\n唯见长江天际流。",
                "translation": "老朋友在西面的黄鹤楼与我辞别，在柳絮如烟、繁花似锦的阳春三月去扬州远游。友人的孤船帆影渐渐远去，消失在碧空的尽头，只看见一线长江向邈远的天际奔流。"
            },
            {
                "id": 6,
                "title": "早发白帝城",
                "author": "李白",
                "dynasty": "唐",
                "content": "朝辞白帝彩云间，\n千里江陵一日还。\n两岸猿声啼不住，\n轻舟已过万重山。",
                "translation": "清晨告别五彩云霞映照中的白帝城，千里之遥的江陵一天之间就可以到达。两岸猿声还在耳边不停地回荡，轻快的小舟已驶过万重青山。"
            },
            {
                "id": 7,
                "title": "江雪",
                "author": "柳宗元",
                "dynasty": "唐",
                "content": "千山鸟飞绝，\n万径人踪灭。\n孤舟蓑笠翁，\n独钓寒江雪。",
                "translation": "所有的山上，飞鸟的身影已经绝迹，所有道路上都看不见人的踪迹。江面孤舟上，一位披戴着蓑笠的老翁，独自在漫天风雪中垂钓。"
            },
            {
                "id": 8,
                "title": "枫桥夜泊",
                "author": "张继",
                "dynasty": "唐",
                "content": "月落乌啼霜满天，\n江枫渔火对愁眠。\n姑苏城外寒山寺，\n夜半钟声到客船。",
                "translation": "月亮已落下，乌鸦啼叫，寒气满天，对着江边枫树和渔火忧愁而眠。姑苏城外那寂寞清静寒山古寺，半夜里敲钟的声音传到了客船。"
            },
            {
                "id": 9,
                "title": "出塞",
                "author": "王昌龄",
                "dynasty": "唐",
                "content": "秦时明月汉时关，\n万里长征人未还。\n但使龙城飞将在，\n不教胡马度阴山。",
                "translation": "依旧是秦汉时期的明月和边关，守边御敌鏖战万里征人未回还。倘若龙城的飞将李广如今还在，绝不让匈奴南下牧马度过阴山。"
            },
            {
                "id": 10,
                "title": "凉州词",
                "author": "王之涣",
                "dynasty": "唐",
                "content": "黄河远上白云间，\n一片孤城万仞山。\n羌笛何须怨杨柳，\n春风不度玉门关。",
                "translation": "黄河好像从白云间奔流而来，玉门关孤独地耸峙在高山中。何必用羌笛吹起那哀怨的《杨柳曲》去埋怨春光迟迟不来呢，春风根本吹不到玉门关外。"
            },
            {
                "id": 11,
                "title": "春望",
                "author": "杜甫",
                "dynasty": "唐",
                "content": "国破山河在，城春草木深。\n感时花溅泪，恨别鸟惊心。\n烽火连三月，家书抵万金。\n白头搔更短，浑欲不胜簪。",
                "translation": "长安沦陷，国家破碎，只有山河依旧；春天来了，人烟稀少的长安城里草木茂密。感伤国事，不禁涕泪四溅，鸟鸣惊心，徒增离愁别恨。连绵的战火已经延续了半年多，家书难得，一封抵得上万两黄金。愁绪缠绕，搔头思考，白发越搔越短，简直要不能插簪了。"
            },
            {
                "id": 12,
                "title": "登高",
                "author": "杜甫",
                "dynasty": "唐",
                "content": "风急天高猿啸哀，渚清沙白鸟飞回。\n无边落木萧萧下，不尽长江滚滚来。\n万里悲秋常作客，百年多病独登台。\n艰难苦恨繁霜鬓，潦倒新停浊酒杯。",
                "translation": "风急天高，猿猴啼叫显得十分悲哀，水清沙白的河洲上有鸟儿在盘旋。无边无际的树木萧萧地飘下落叶，望不到头的长江水滚滚奔腾而来。悲对秋景感慨万里漂泊常年为客，一生当中疾病缠身今日独上高台。历尽了艰难苦恨白发长满了双鬓，衰颓满心偏又暂停了浇愁的酒杯。"
            },
            {
                "id": 13,
                "title": "黄鹤楼",
                "author": "崔颢",
                "dynasty": "唐",
                "content": "昔人已乘黄鹤去，此地空余黄鹤楼。\n黄鹤一去不复返，白云千载空悠悠。\n晴川历历汉阳树，芳草萋萋鹦鹉洲。\n日暮乡关何处是？烟波江上使人愁。",
                "translation": "昔日的仙人已乘着黄鹤飞去，这地方只留下空荡的黄鹤楼。黄鹤一去再也没有返回这里，千万年来只有白云飘飘悠悠。阳光下汉阳的树木历历可辨，更能看清芳草繁茂的鹦鹉洲。天色已晚，眺望远方，故乡在哪儿呢？眼前只见一片雾霭笼罩江面，给人带来深深的愁绪。"
            },
            {
                "id": 14,
                "title": "将进酒",
                "author": "李白",
                "dynasty": "唐",
                "content": "君不见，黄河之水天上来，奔流到海不复回。\n君不见，高堂明镜悲白发，朝如青丝暮成雪。\n人生得意须尽欢，莫使金樽空对月。\n天生我材必有用，千金散尽还复来。\n烹羊宰牛且为乐，会须一饮三百杯。",
                "translation": "你没看到吗？黄河之水仿佛从天上奔腾而来，滚滚东流入海再也不会回头。你没看到吗？在高堂上对着明镜感叹自己的白发，早晨还是乌黑的青丝傍晚就变成了雪白的头。人生得意之时就应该尽情欢乐，不要让金杯空对皎洁的明月。上天生下我这等人才就一定有它的用处，千两黄金散尽了也还能再次获得。"
            },
            {
                "id": 15,
                "title": "相思",
                "author": "王维",
                "dynasty": "唐",
                "content": "红豆生南国，春来发几枝。\n愿君多采撷，此物最相思。",
                "translation": "红豆生长在南国的土地上，每逢春天不知长多少新枝。希望你能尽情地摘取采集，因为这红豆最能寄托相思。"
            }
        ]
    
    def create_widgets(self):
        """创建界面组件"""
        # 标题
        title_frame = tk.Frame(self.root, bg='#f5f5dc')
        title_frame.pack(pady=15)
        
        title_label = tk.Label(title_frame, text="唐诗三百首", 
                               font=("楷体", 28, "bold"), 
                               fg="#8b4513", bg='#f5f5dc')
        title_label.pack()
        
        # 搜索和按钮栏
        control_frame = tk.Frame(self.root, bg='#f5f5dc')
        control_frame.pack(pady=10)
        
        # 搜索框
        tk.Label(control_frame, text="搜索:", font=("微软雅黑", 11), 
                bg='#f5f5dc').pack(side=tk.LEFT, padx=5)
        
        self.search_entry = tk.Entry(control_frame, width=25, font=("微软雅黑", 11))
        self.search_entry.pack(side=tk.LEFT, padx=5)
        self.search_entry.bind('<Return>', lambda event: self.search_poem())
        
        search_btn = tk.Button(control_frame, text="搜索", command=self.search_poem,
                              font=("微软雅黑", 10), bg="#8b4513", fg="white",
                              cursor="hand2", width=8)
        search_btn.pack(side=tk.LEFT, padx=5)
        
        random_btn = tk.Button(control_frame, text="随机一首", command=self.show_random_poem,
                              font=("微软雅黑", 10), bg="#cd853f", fg="white",
                              cursor="hand2", width=8)
        random_btn.pack(side=tk.LEFT, padx=5)
        
        # 诗词列表（左侧）
        list_frame = tk.Frame(self.root, bg='#f5f5dc')
        list_frame.pack(side=tk.LEFT, fill=tk.Y, padx=(20, 10), pady=10)
        
        tk.Label(list_frame, text="📖 诗词列表", font=("微软雅黑", 12, "bold"),
                bg='#f5f5dc', fg="#8b4513").pack()
        
        # 创建带滚动条的列表
        scrollbar = tk.Scrollbar(list_frame)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
        self.poem_listbox = tk.Listbox(list_frame, width=28, height=28,
                                       font=("微软雅黑", 10),
                                       yscrollcommand=scrollbar.set,
                                       bg="#fffaf0", selectbackground="#cd853f")
        self.poem_listbox.pack(side=tk.LEFT, fill=tk.Y)
        scrollbar.config(command=self.poem_listbox.yview)
        
        # 填充诗词列表
        for poem in self.poems:
            self.poem_listbox.insert(tk.END, f"{poem['title']}  -  {poem['author']}")
        
        # 绑定选择事件
        self.poem_listbox.bind('<<ListboxSelect>>', self.on_poem_select)
        
        # 诗词内容显示区域（右侧）
        content_frame = tk.Frame(self.root, bg='#f5f5dc')
        content_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=(10, 20), pady=10)
        
        # 诗词标题和作者
        self.title_author_label = tk.Label(content_frame, text="", 
                                           font=("楷体", 18, "bold"),
                                           fg="#8b4513", bg='#f5f5dc')
        self.title_author_label.pack(pady=(0, 10))
        
        # 标签页
        notebook = ttk.Notebook(content_frame)
        notebook.pack(fill=tk.BOTH, expand=True)
        
        # 原文标签页
        original_frame = tk.Frame(notebook, bg='#fffaf0')
        notebook.add(original_frame, text="原文")
        
        self.content_text = scrolledtext.ScrolledText(original_frame, wrap=tk.WORD,
                                                      font=("楷体", 13),
                                                      bg="#fffaf0", fg="#2c2c2c")
        self.content_text.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # 译文标签页
        translation_frame = tk.Frame(notebook, bg='#fffaf0')
        notebook.add(translation_frame, text="译文")
        
        self.translation_text = scrolledtext.ScrolledText(translation_frame, wrap=tk.WORD,
                                                          font=("微软雅黑", 11),
                                                          bg="#fffaf0", fg="#2c2c2c")
        self.translation_text.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # 底部按钮
        bottom_frame = tk.Frame(self.root, bg='#f5f5dc')
        bottom_frame.pack(side=tk.BOTTOM, pady=10)
        
        prev_btn = tk.Button(bottom_frame, text="◀ 上一首", command=self.prev_poem,
                            font=("微软雅黑", 10), bg="#cd853f", fg="white",
                            cursor="hand2", width=10)
        prev_btn.pack(side=tk.LEFT, padx=10)
        
        # 显示诗词数量
        self.count_label = tk.Label(bottom_frame, text=f"共 {len(self.poems)} 首唐诗",
                                    font=("微软雅黑", 10), bg='#f5f5dc', fg="#8b4513")
        self.count_label.pack(side=tk.LEFT, padx=20)
        
        next_btn = tk.Button(bottom_frame, text="下一首 ▶", command=self.next_poem,
                            font=("微软雅黑", 10), bg="#cd853f", fg="white",
                            cursor="hand2", width=10)
        next_btn.pack(side=tk.LEFT, padx=10)
        
        # 当前索引
        self.current_index = 0
    
    def display_poem(self, poem):
        """显示诗词内容"""
        # 显示标题和作者
        self.title_author_label.config(text=f"{poem['title']}  ·  {poem['author']}（{poem['dynasty']}）")
        
        # 显示原文
        self.content_text.config(state=tk.NORMAL)
        self.content_text.delete(1.0, tk.END)
        self.content_text.insert(1.0, poem['content'])
        self.content_text.config(state=tk.DISABLED)
        
        # 显示译文
        self.translation_text.config(state=tk.NORMAL)
        self.translation_text.delete(1.0, tk.END)
        self.translation_text.insert(1.0, poem.get('translation', '暂无译文'))
        self.translation_text.config(state=tk.DISABLED)
    
    def show_random_poem(self):
        """随机显示一首诗"""
        if self.poems:
            self.current_index = random.randint(0, len(self.poems) - 1)
            self.display_poem(self.poems[self.current_index])
            # 在列表中高亮显示
            self.poem_listbox.selection_clear(0, tk.END)
            self.poem_listbox.selection_set(self.current_index)
            self.poem_listbox.see(self.current_index)
    
    def search_poem(self):
        """搜索诗词"""
        keyword = self.search_entry.get().strip()
        if not keyword:
            messagebox.showwarning("提示", "请输入搜索关键词")
            return
        
        # 搜索匹配的诗词
        results = []
        for i, poem in enumerate(self.poems):
            if (keyword in poem['title'] or 
                keyword in poem['author'] or 
                keyword in poem['content'] or
                keyword in poem.get('translation', '')):
                results.append((i, poem))
        
        if not results:
            messagebox.showinfo("搜索结果", f"❌ 未找到包含 '{keyword}' 的诗词")
            return
        
        # 如果只有一条结果，直接显示
        if len(results) == 1:
            self.current_index = results[0][0]
            self.display_poem(results[0][1])
            self.poem_listbox.selection_clear(0, tk.END)
            self.poem_listbox.selection_set(self.current_index)
            self.poem_listbox.see(self.current_index)
            messagebox.showinfo("搜索结果", f"✅ 找到 1 首相关诗词")
        else:
            # 多条结果，让用户选择
            result_window = tk.Toplevel(self.root)
            result_window.title("搜索结果")
            result_window.geometry("450x400")
            result_window.configure(bg='#f5f5dc')
            
            tk.Label(result_window, text=f"📚 找到 {len(results)} 首相关诗词：", 
                    font=("微软雅黑", 12, "bold"), bg='#f5f5dc', fg="#8b4513").pack(pady=10)
            
            result_listbox = tk.Listbox(result_window, font=("微软雅黑", 11),
                                       bg="#fffaf0", selectbackground="#cd853f")
            result_listbox.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
            
            for idx, (_, poem) in enumerate(results):
                result_listbox.insert(tk.END, f"{poem['title']}  -  {poem['author']}")
            
            def on_result_select():
                selection = result_listbox.curselection()
                if selection:
                    self.current_index = results[selection[0]][0]
                    self.display_poem(results[selection[0]][1])
                    self.poem_listbox.selection_clear(0, tk.END)
                    self.poem_listbox.selection_set(self.current_index)
                    self.poem_listbox.see(self.current_index)
                    result_window.destroy()
            
            def on_double_click(event):
                on_result_select()
            
            result_listbox.bind('<Double-Button-1>', on_double_click)
            
            btn_frame = tk.Frame(result_window, bg='#f5f5dc')
            btn_frame.pack(pady=10)
            
            tk.Button(btn_frame, text="打开所选", command=on_result_select,
                     font=("微软雅黑", 10), bg="#8b4513", fg="white",
                     cursor="hand2", width=12).pack(side=tk.LEFT, padx=10)
            
            tk.Button(btn_frame, text="取消", command=result_window.destroy,
                     font=("微软雅黑", 10), bg="#999", fg="white",
                     cursor="hand2", width=12).pack(side=tk.LEFT, padx=10)
    
    def on_poem_select(self, event):
        """当在列表中选择诗词时"""
        selection = self.poem_listbox.curselection()
        if selection:
            self.current_index = selection[0]
            self.display_poem(self.poems[self.current_index])
    
    def prev_poem(self):
        """上一首"""
        if self.poems:
            self.current_index = (self.current_index - 1) % len(self.poems)
            self.display_poem(self.poems[self.current_index])
            self.poem_listbox.selection_clear(0, tk.END)
            self.poem_listbox.selection_set(self.current_index)
            self.poem_listbox.see(self.current_index)
    
    def next_poem(self):
        """下一首"""
        if self.poems:
            self.current_index = (self.current_index + 1) % len(self.poems)
            self.display_poem(self.poems[self.current_index])
            self.poem_listbox.selection_clear(0, tk.END)
            self.poem_listbox.selection_set(self.current_index)
            self.poem_listbox.see(self.current_index)

def main():
    root = tk.Tk()
    app = TangPoetryApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()