import tkinter as tk
from tkinter import ttk, messagebox
import json
import os
import webbrowser
from PIL import Image, ImageTk  # 需先安装：pip install pillow

# 数据保存文件
DATA_FILE = "words_data.json"
# 背景图片名称（固定为777777.jpg）
BG_IMAGE_NAME = "777777.jpg"
# 常用固定分类
DEFAULT_CATEGORIES = ["单词", "古诗", "成语", "文言文"]

# 初始化数据文件
def init_data():
    if not os.path.exists(DATA_FILE):
        with open(DATA_FILE, "w", encoding="utf-8") as f:
            json.dump([], f, ensure_ascii=False, indent=4)

# 加载数据
def load_data():
    with open(DATA_FILE, "r", encoding="utf-8") as f:
        return json.load(f)

# 保存数据
def save_data(data):
    with open(DATA_FILE, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=4)

# 主界面类
class WordsApp:
    def __init__(self, root):
        self.root = root
        self.root.title("好词好句积累本 ✍️（国风版）")
        self.root.geometry("800x600")
        self.root.resizable(False, False)

        # ========== 背景图片设置（777777.jpg） ==========
        try:
            # 加载并调整背景图片大小适配窗口
            self.bg_image = Image.open(BG_IMAGE_NAME)
            self.bg_image = self.bg_image.resize((800, 600), Image.Resampling.LANCZOS)
            self.bg_photo = ImageTk.PhotoImage(self.bg_image)
            
            # 创建背景标签（底层）
            self.bg_label = tk.Label(root, image=self.bg_photo)
            self.bg_label.place(x=0, y=0, relwidth=1, relheight=1)
            # 保留图片引用，防止被垃圾回收
            self.bg_label.image = self.bg_photo
        except Exception as e:
            # 图片加载失败时的兜底处理
            root.configure(bg="#f5f2e9")
            messagebox.showinfo("提示", f"背景图片【{BG_IMAGE_NAME}】加载失败\n原因：{str(e)}\n已切换为默认背景")

        # ========== 顶部添加区域（半透明背景） ==========
        self.frame_add = tk.Frame(root, bg="#f5f2e9", bd=0, relief=tk.FLAT, padx=10, pady=8)
        self.frame_add.pack(pady=15, fill=tk.X, padx=40)

        tk.Label(self.frame_add, text="选择分类：", font=("微软雅黑", 12), bg="#f5f2e9", fg="#333333").grid(row=0, column=0, sticky="w")
        # 下拉分类框（只读，防止手动输入）
        self.selected_category = tk.StringVar()
        self.category_box = ttk.Combobox(
            self.frame_add, 
            textvariable=self.selected_category,
            values=DEFAULT_CATEGORIES,
            font=("微软雅黑", 12), 
            width=10,
            state="readonly"
        )
        self.category_box.grid(row=0, column=1, padx=8)
        self.category_box.current(0)

        tk.Label(self.frame_add, text="内容：", font=("微软雅黑", 12), bg="#f5f2e9", fg="#333333").grid(row=0, column=2, padx=8)
        self.content_entry = ttk.Entry(self.frame_add, font=("微软雅黑", 12), width=35)
        self.content_entry.grid(row=0, column=3, padx=8)

        # 自定义添加按钮（国风配色）
        add_btn = tk.Button(self.frame_add, text="添加", command=self.add_word, 
                           font=("微软雅黑", 11), bg="#4a7c59", fg="white", 
                           padx=15, pady=2, bd=0, relief=tk.FLAT, cursor="hand2")
        add_btn.grid(row=0, column=4, padx=8)

        # ========== 中间筛选区域 ==========
        self.frame_search = tk.Frame(root, bg="#f5f2e9", bd=0, relief=tk.FLAT, padx=10, pady=5)
        self.frame_search.pack(pady=8, fill=tk.X, padx=40)

        tk.Label(self.frame_search, text="筛选分类：", font=("微软雅黑", 11), bg="#f5f2e9", fg="#333333").grid(row=0, column=0)
        self.filter_var = tk.StringVar()
        self.filter_box = ttk.Combobox(
            self.frame_search, 
            textvariable=self.filter_var,
            values=DEFAULT_CATEGORIES,
            font=("微软雅黑", 11), 
            width=12,
            state="readonly"
        )
        self.filter_box.grid(row=0, column=1, padx=8)

        # 筛选按钮
        filter_btn = tk.Button(self.frame_search, text="筛选查看", command=self.filter_show,
                              font=("微软雅黑", 10), bg="#6a994e", fg="white",
                              padx=10, pady=1, bd=0, relief=tk.FLAT, cursor="hand2")
        filter_btn.grid(row=0, column=2, padx=8)
        
        # 显示全部按钮
        all_btn = tk.Button(self.frame_search, text="显示全部", command=self.show_all,
                           font=("微软雅黑", 10), bg="#6a994e", fg="white",
                           padx=10, pady=1, bd=0, relief=tk.FLAT, cursor="hand2")
        all_btn.grid(row=0, column=3, padx=8)

        # ========== 列表区域（白底保证可读性） ==========
        self.frame_list = tk.Frame(root, bg="#f5f2e9", bd=0, relief=tk.FLAT, padx=5, pady=5)
        self.frame_list.pack(pady=10, fill=tk.BOTH, expand=True, padx=40)

        # 滚动条
        self.scrollbar = ttk.Scrollbar(self.frame_list)
        self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        # 列表框
        self.list_box = tk.Listbox(
            self.frame_list,
            font=("微软雅黑", 12),
            yscrollcommand=self.scrollbar.set,
            height=18,
            bg="white",
            fg="#333333",
            bd=0,
            relief=tk.FLAT,
            selectbackground="#a7c957",  # 选中行背景色（竹绿色）
            selectforeground="#000000"
        )
        self.list_box.pack(fill=tk.BOTH, expand=True)
        self.scrollbar.config(command=self.list_box.yview)

        # ========== 底部按钮区域 ==========
        self.frame_btn = tk.Frame(root, bg="#f5f2e9", bd=0, relief=tk.FLAT)
        self.frame_btn.pack(pady=12)

        # 删除按钮
        del_btn = tk.Button(self.frame_btn, text="删除选中", command=self.delete_selected,
                           font=("微软雅黑", 11), bg="#bc4749", fg="white",
                           padx=15, pady=3, bd=0, relief=tk.FLAT, cursor="hand2")
        del_btn.pack(side=tk.LEFT, padx=10)

        # 上网查找按钮
        search_btn = tk.Button(self.frame_btn, text="🌐 上网查找", command=self.search_online,
                              font=("微软雅黑", 11), bg="#386641", fg="white",
                              padx=15, pady=3, bd=0, relief=tk.FLAT, cursor="hand2")
        search_btn.pack(side=tk.LEFT, padx=10)

        # 退出按钮
        quit_btn = tk.Button(self.frame_btn, text="退出程序", command=root.quit,
                             font=("微软雅黑", 11), bg="#577590", fg="white",
                             padx=15, pady=3, bd=0, relief=tk.FLAT, cursor="hand2")
        quit_btn.pack(side=tk.LEFT, padx=10)

        # 初始加载所有内容
        self.show_all()

    # 添加内容
    def add_word(self):
        cate = self.selected_category.get().strip()
        content = self.content_entry.get().strip()
        
        if not content:
            messagebox.showwarning("提示", "内容不能为空！")
            return

        data = load_data()
        data.append({"分类": cate, "内容": content})
        save_data(data)

        self.content_entry.delete(0, tk.END)
        self.show_all()
        messagebox.showinfo("成功", "添加完成！")

    # 显示全部内容
    def show_all(self):
        self.list_box.delete(0, tk.END)
        data = load_data()
        for i, item in enumerate(data, 1):
            self.list_box.insert(tk.END, f"{i}. 【{item['分类']}】{item['内容']}")

    # 按分类筛选显示
    def filter_show(self):
        keyword = self.filter_var.get().strip()
        if not keyword:
            messagebox.showwarning("提示", "请选择要筛选的分类！")
            return

        self.list_box.delete(0, tk.END)
        data = load_data()
        count = 0
        for i, item in enumerate(data, 1):
            if item["分类"] == keyword:
                self.list_box.insert(tk.END, f"{i}. 【{item['分类']}】{item['内容']}")
                count += 1
        if count == 0:
            messagebox.showinfo("提示", f"【{keyword}】分类下暂无内容！")

    # 删除选中内容
    def delete_selected(self):
        try:
            index = self.list_box.curselection()[0]
            data = load_data()
            deleted_item = data.pop(index)
            save_data(data)
            self.show_all()
            messagebox.showinfo("成功", f"已删除：【{deleted_item['分类']}】{deleted_item['内容']}")
        except IndexError:
            messagebox.showwarning("提示", "请先选中一条要删除的内容！")

    # 上网查找选中内容
    def search_online(self):
        try:
            idx = self.list_box.curselection()[0]
            data = load_data()
            item = data[idx]
            content = item["内容"]
            cate = item["分类"]
            
            # 拼接百度搜索链接并打开浏览器
            search_url = f"https://www.baidu.com/s?wd={cate} {content}"
            webbrowser.open(search_url)
            messagebox.showinfo("查找中", f"正在浏览器搜索：\n【{cate}】{content}")
        
        except IndexError:
            messagebox.showwarning("提示", "请先选中一条内容再查找！")

# 程序入口
if __name__ == "__main__":
    # 检查并安装pillow依赖
    try:
        from PIL import Image, ImageTk
    except ImportError:
        messagebox.showinfo("提示", "正在安装图片处理依赖（pillow）...")
        os.system("pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple")
        from PIL import Image, ImageTk

    # 初始化数据 + 启动界面
    init_data()
    root = tk.Tk()
    app = WordsApp(root)
    root.mainloop()