# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import ttk, messagebox
import random


class TangPoetryApp:
    def __init__(self, root):
        self.root = root
        self.root.title("唐诗三百首")
        self.root.geometry("900x700")
        self.root.configure(bg='#f5f0e6')

        # 诗歌数据
        self.poems = []
        self.current_index = 0
        self.filtered_indices = []  # 搜索过滤后的索引

        # 加载诗歌数据
        self.load_poems()

        # 创建界面
        self.create_widgets()

        # 显示第一首诗
        if self.poems:
            self.display_poem(0)

    def load_poems(self):
        """加载正确的唐诗数据"""
        self.poems = [
            {"title": "静夜思", "author": "李白",
                "content": "床前明月光，\n疑是地上霜。\n举头望明月，\n低头思故乡。"},
            {"title": "春晓", "author": "孟浩然",
                "content": "春眠不觉晓，\n处处闻啼鸟。\n夜来风雨声，\n花落知多少。"},
            {"title": "登鹳雀楼", "author": "王之涣",
                "content": "白日依山尽，\n黄河入海流。\n欲穷千里目，\n更上一层楼。"},
            {"title": "望庐山瀑布", "author": "李白",
                "content": "日照香炉生紫烟，\n遥看瀑布挂前川。\n飞流直下三千尺，\n疑是银河落九天。"},
            {"title": "黄鹤楼送孟浩然之广陵", "author": "李白",
                "content": "故人西辞黄鹤楼，\n烟花三月下扬州。\n孤帆远影碧空尽，\n唯见长江天际流。"},
            {"title": "春夜喜雨", "author": "杜甫",
                "content": "好雨知时节，\n当春乃发生。\n随风潜入夜，\n润物细无声。\n野径云俱黑，\n江船火独明。\n晓看红湿处，\n花重锦官城。"},
            {"title": "绝句", "author": "杜甫",
                "content": "两个黄鹂鸣翠柳，\n一行白鹭上青天。\n窗含西岭千秋雪，\n门泊东吴万里船。"},
            {"title": "江雪", "author": "柳宗元",
                "content": "千山鸟飞绝，\n万径人踪灭。\n孤舟蓑笠翁，\n独钓寒江雪。"},
            {"title": "相思", "author": "王维",
                "content": "红豆生南国，\n春来发几枝。\n愿君多采撷，\n此物最相思。"},
            {"title": "九月九日忆山东兄弟", "author": "王维",
                "content": "独在异乡为异客，\n每逢佳节倍思亲。\n遥知兄弟登高处，\n遍插茱萸少一人。"},
            {"title": "枫桥夜泊", "author": "张继",
                "content": "月落乌啼霜满天，\n江枫渔火对愁眠。\n姑苏城外寒山寺，\n夜半钟声到客船。"},
            {"title": "出塞", "author": "王昌龄",
                "content": "秦时明月汉时关，\n万里长征人未还。\n但使龙城飞将在，\n不教胡马度阴山。"},
            {"title": "凉州词", "author": "王之涣",
                "content": "黄河远上白云间，\n一片孤城万仞山。\n羌笛何须怨杨柳，\n春风不度玉门关。"},
            {"title": "鹿柴", "author": "王维",
                "content": "空山不见人，\n但闻人语响。\n返景入深林，\n复照青苔上。"},
            {"title": "悯农", "author": "李绅",
                "content": "锄禾日当午，\n汗滴禾下土。\n谁知盘中餐，\n粒粒皆辛苦。"},
            {"title": "游子吟", "author": "孟郊",
                "content": "慈母手中线，\n游子身上衣。\n临行密密缝，\n意恐迟迟归。\n谁言寸草心，\n报得三春晖。"},
            {"title": "赋得古原草送别", "author": "白居易",
                "content": "离离原上草，\n一岁一枯荣。\n野火烧不尽，\n春风吹又生。\n远芳侵古道，\n晴翠接荒城。\n又送王孙去，\n萋萋满别情。"},
            {"title": "山行", "author": "杜牧",
                "content": "远上寒山石径斜，\n白云生处有人家。\n停车坐爱枫林晚，\n霜叶红于二月花。"},
            {"title": "清明", "author": "杜牧",
                "content": "清明时节雨纷纷，\n路上行人欲断魂。\n借问酒家何处有，\n牧童遥指杏花村。"},
            {"title": "乐游原", "author": "李商隐",
                "content": "向晚意不适，\n驱车登古原。\n夕阳无限好，\n只是近黄昏。"},
            {"title": "黄鹤楼", "author": "崔颢",
                "content": "昔人已乘黄鹤去，\n此地空余黄鹤楼。\n黄鹤一去不复返，\n白云千载空悠悠。\n晴川历历汉阳树，\n芳草萋萋鹦鹉洲。\n日暮乡关何处是，\n烟波江上使人愁。"},
            {"title": "春望", "author": "杜甫",
                "content": "国破山河在，\n城春草木深。\n感时花溅泪，\n恨别鸟惊心。\n烽火连三月，\n家书抵万金。\n白头搔更短，\n浑欲不胜簪。"},
            {"title": "望岳", "author": "杜甫",
                "content": "岱宗夫如何？\n齐鲁青未了。\n造化钟神秀，\n阴阳割昏晓。\n荡胸生曾云，\n决眦入归鸟。\n会当凌绝顶，\n一览众山小。"},
            {"title": "使至塞上", "author": "王维",
                "content": "单车欲问边，\n属国过居延。\n征蓬出汉塞，\n归雁入胡天。\n大漠孤烟直，\n长河落日圆。\n萧关逢候骑，\n都护在燕然。"},
            {"title": "白雪歌送武判官归京", "author": "岑参", "content": "北风卷地白草折，\n胡天八月即飞雪。\n忽如一夜春风来，\n千树万树梨花开。\n散入珠帘湿罗幕，\n狐裘不暖锦衾薄。\n将军角弓不得控，\n都护铁衣冷难着。\n瀚海阑干百丈冰，\n愁云惨淡万里凝。\n中军置酒饮归客，\n胡琴琵琶与羌笛。\n纷纷暮雪下辕门，\n风掣红旗冻不翻。\n轮台东门送君去，\n去时雪满天山路。\n山回路转不见君，\n雪上空留马行处。"},
            {"title": "钱塘湖春行", "author": "白居易",
                "content": "孤山寺北贾亭西，\n水面初平云脚低。\n几处早莺争暖树，\n谁家新燕啄春泥。\n乱花渐欲迷人眼，\n浅草才能没马蹄。\n最爱湖东行不足，\n绿杨阴里白沙堤。"},
            {"title": "闻王昌龄左迁龙标遥有此寄", "author": "李白",
                "content": "杨花落尽子规啼，\n闻道龙标过五溪。\n我寄愁心与明月，\n随君直到夜郎西。"},
            {"title": "夜雨寄北", "author": "李商隐",
                "content": "君问归期未有期，\n巴山夜雨涨秋池。\n何当共剪西窗烛，\n却话巴山夜雨时。"},
            {"title": "泊秦淮", "author": "杜牧",
                "content": "烟笼寒水月笼沙，\n夜泊秦淮近酒家。\n商女不知亡国恨，\n隔江犹唱后庭花。"},
            {"title": "过零丁洋", "author": "文天祥",
                "content": "辛苦遭逢起一经，\n干戈寥落四周星。\n山河破碎风飘絮，\n身世浮沉雨打萍。\n惶恐滩头说惶恐，\n零丁洋里叹零丁。\n人生自古谁无死，\n留取丹心照汗青。"},
            {"title": "无题", "author": "李商隐",
                "content": "相见时难别亦难，\n东风无力百花残。\n春蚕到死丝方尽，\n蜡炬成灰泪始干。\n晓镜但愁云鬓改，\n夜吟应觉月光寒。\n蓬山此去无多路，\n青鸟殷勤为探看。"},
            {"title": "登高", "author": "杜甫",
                "content": "风急天高猿啸哀，\n渚清沙白鸟飞回。\n无边落木萧萧下，\n不尽长江滚滚来。\n万里悲秋常作客，\n百年多病独登台。\n艰难苦恨繁霜鬓，\n潦倒新停浊酒杯。"},
            {"title": "锦瑟", "author": "李商隐",
                "content": "锦瑟无端五十弦，\n一弦一柱思华年。\n庄生晓梦迷蝴蝶，\n望帝春心托杜鹃。\n沧海月明珠有泪，\n蓝田日暖玉生烟。\n此情可待成追忆，\n只是当时已惘然。"},
        ]

    def create_widgets(self):
        """创建界面组件"""
        # 顶部标题
        title_frame = tk.Frame(self.root, bg='#8B4513', height=80)
        title_frame.pack(fill=tk.X, pady=(0, 10))
        title_frame.pack_propagate(False)

        title_label = tk.Label(title_frame, text="唐诗三百首",
                               font=('楷体', 28, 'bold'),
                               bg='#8B4513', fg='#FFD700')
        title_label.pack(expand=True)

        # 主要内容区域
        main_paned = tk.PanedWindow(self.root, orient=tk.HORIZONTAL,
                                    bg='#f5f0e6', sashwidth=5)
        main_paned.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)

        # 左侧：诗歌列表
        left_frame = tk.Frame(main_paned, bg='#f5f0e6')
        main_paned.add(left_frame, width=280)

        list_label = tk.Label(left_frame, text="诗歌列表",
                              font=('微软雅黑', 14, 'bold'),
                              bg='#f5f0e6', fg='#8B4513')
        list_label.pack(pady=5)

        # 搜索框
        search_frame = tk.Frame(left_frame, bg='#f5f0e6')
        search_frame.pack(pady=5, padx=10, fill=tk.X)

        self.search_var = tk.StringVar()
        self.search_var.trace('w', self.search_poems)
        search_entry = tk.Entry(search_frame, textvariable=self.search_var,
                                font=('微软雅黑', 10))
        search_entry.pack(fill=tk.X, side=tk.LEFT, expand=True)

        search_btn = tk.Button(search_frame, text="搜索",
                               command=self.search_poems,
                               bg='#8B4513', fg='white',
                               font=('微软雅黑', 9))
        search_btn.pack(side=tk.RIGHT, padx=(5, 0))

        # 诗歌列表
        list_frame = tk.Frame(left_frame, bg='#f5f0e6')
        list_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)

        scrollbar = tk.Scrollbar(list_frame)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        self.poem_listbox = tk.Listbox(list_frame, font=('微软雅黑', 11),
                                       yscrollcommand=scrollbar.set,
                                       bg='#FFF8DC', fg='#333333',
                                       selectbackground='#8B4513',
                                       selectforeground='white')
        self.poem_listbox.pack(fill=tk.BOTH, expand=True)
        scrollbar.config(command=self.poem_listbox.yview)

        # 填充诗歌列表
        self.update_listbox()

        self.poem_listbox.bind('<<ListboxSelect>>', self.on_poem_select)

        # 右侧：诗歌展示
        right_frame = tk.Frame(main_paned, bg='#f5f0e6')
        main_paned.add(right_frame, width=600)

        # 诗歌信息区域
        info_frame = tk.Frame(right_frame, bg='#FFF8DC', relief=tk.RIDGE, bd=2)
        info_frame.pack(fill=tk.X, pady=5, padx=10)

        self.title_label = tk.Label(info_frame, text="",
                                    font=('楷体', 20, 'bold'),
                                    bg='#FFF8DC', fg='#8B4513')
        self.title_label.pack(pady=(15, 5))

        self.author_label = tk.Label(info_frame, text="",
                                     font=('楷体', 14, 'italic'),
                                     bg='#FFF8DC', fg='#666666')
        self.author_label.pack(pady=(0, 15))

        # 诗歌内容区域
        content_frame = tk.Frame(right_frame, bg='#f5f0e6')
        content_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

        content_scrollbar = tk.Scrollbar(content_frame)
        content_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        self.content_text = tk.Text(content_frame, font=('楷体', 14),
                                    wrap=tk.WORD, bg='#FFFFF0',
                                    yscrollcommand=content_scrollbar.set,
                                    relief=tk.SUNKEN, bd=1)
        self.content_text.pack(fill=tk.BOTH, expand=True)
        content_scrollbar.config(command=self.content_text.yview)

        # 按钮区域
        button_frame = tk.Frame(right_frame, bg='#f5f0e6')
        button_frame.pack(fill=tk.X, pady=10, padx=10)

        prev_btn = tk.Button(button_frame, text="上一首",
                             command=self.prev_poem,
                             font=('微软雅黑', 11),
                             bg='#8B4513', fg='white',
                             padx=20, pady=5)
        prev_btn.pack(side=tk.LEFT, padx=5)

        random_btn = tk.Button(button_frame, text="随机一首",
                               command=self.random_poem,
                               font=('微软雅黑', 11),
                               bg='#CD853F', fg='white',
                               padx=20, pady=5)
        random_btn.pack(side=tk.LEFT, padx=5)

        next_btn = tk.Button(button_frame, text="下一首",
                             command=self.next_poem,
                             font=('微软雅黑', 11),
                             bg='#8B4513', fg='white',
                             padx=20, pady=5)
        next_btn.pack(side=tk.LEFT, padx=5)

        # 状态栏
        status_frame = tk.Frame(self.root, bg='#8B4513', height=30)
        status_frame.pack(fill=tk.X, side=tk.BOTTOM)
        status_frame.pack_propagate(False)

        self.status_label = tk.Label(status_frame, text=f"共{len(self.poems)}首唐诗",
                                     font=('微软雅黑', 9),
                                     bg='#8B4513', fg='#FFD700')
        self.status_label.pack(side=tk.LEFT, padx=10, pady=5)

    def update_listbox(self, poem_list=None):
        """更新诗歌列表显示"""
        self.poem_listbox.delete(0, tk.END)

        if poem_list is None:
            poem_list = self.poems

        for poem in poem_list:
            self.poem_listbox.insert(
                tk.END, f"{poem['title']}  —  {poem['author']}")

    def get_current_filtered_list(self):
        """获取当前过滤后的诗歌列表"""
        keyword = self.search_var.get().strip()
        if not keyword:
            return self.poems

        filtered = []
        for poem in self.poems:
            if (keyword in poem['title'] or
                keyword in poem['author'] or
                    keyword in poem['content']):
                filtered.append(poem)
        return filtered

    def display_poem(self, index):
        """显示指定索引的诗歌"""
        filtered_poems = self.get_current_filtered_list()

        if 0 <= index < len(filtered_poems):
            poem = filtered_poems[index]
            self.title_label.config(text=poem['title'])
            self.author_label.config(text=f"—— {poem['author']} ——")

            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.current_index = self.poems.index(
                poem) if poem in self.poems else 0

            # 更新状态栏
            self.status_label.config(
                text=f"第{index+1}首 / 共{len(filtered_poems)}首 — {poem['title']}")

            # 更新列表选中项
            self.poem_listbox.selection_clear(0, tk.END)
            self.poem_listbox.selection_set(index)
            self.poem_listbox.see(index)

    def on_poem_select(self, event):
        """列表选择事件"""
        selection = self.poem_listbox.curselection()
        if selection:
            filtered_poems = self.get_current_filtered_list()
            if selection[0] < len(filtered_poems):
                poem = filtered_poems[selection[0]]
                # 在原始列表中找到索引
                original_index = self.poems.index(poem)
                self.current_index = original_index
                self.display_poem(selection[0])

    def prev_poem(self):
        """上一首"""
        filtered_poems = self.get_current_filtered_list()
        current_filtered_index = self.get_current_filtered_index()

        if current_filtered_index > 0:
            self.display_poem(current_filtered_index - 1)
        else:
            messagebox.showinfo("提示", "已经是第一首了！")

    def next_poem(self):
        """下一首"""
        filtered_poems = self.get_current_filtered_list()
        current_filtered_index = self.get_current_filtered_index()

        if current_filtered_index < len(filtered_poems) - 1:
            self.display_poem(current_filtered_index + 1)
        else:
            messagebox.showinfo("提示", "已经是最后一首了！")

    def get_current_filtered_index(self):
        """获取当前显示诗歌在过滤列表中的索引"""
        current_poem = None
        filtered_poems = self.get_current_filtered_list()

        # 获取当前显示的诗歌
        title = self.title_label.cget("text")
        author = self.author_label.cget("text").replace(
            "——", "").replace("——", "").strip()

        for poem in filtered_poems:
            if poem['title'] == title and poem['author'] == author:
                return filtered_poems.index(poem)
        return 0

    def random_poem(self):
        """随机一首"""
        filtered_poems = self.get_current_filtered_list()
        if filtered_poems:
            random_index = random.randint(0, len(filtered_poems) - 1)
            self.display_poem(random_index)

    def search_poems(self, *args):
        """搜索诗歌"""
        keyword = self.search_var.get().strip()
        filtered_poems = self.get_current_filtered_list()

        self.update_listbox(filtered_poems)

        self.status_label.config(text=f"找到{len(filtered_poems)}首相关唐诗")

        if filtered_poems:
            self.display_poem(0)
        else:
            self.content_text.config(state=tk.NORMAL)
            self.content_text.delete(1.0, tk.END)
            self.content_text.insert(1.0, "未找到相关诗歌\n\n请尝试其他关键词")
            self.content_text.config(state=tk.DISABLED)
            self.title_label.config(text="未找到")
            self.author_label.config(text="")
            messagebox.showinfo("提示", f"未找到包含「{keyword}」的诗歌")


def main():
    root = tk.Tk()
    app = TangPoetryApp(root)
    root.mainloop()


if __name__ == "__main__":
    main()
