import tkinter as tk
from tkinter import ttk, messagebox
import json
import os
import webbrowser
from datetime import datetime
from PIL import Image, ImageTk

# 配置
DATA_FILE = "words_data.json"
RECORD_FILE = "daily_record.json"
BG_IMAGE_NAME = "777777.jpg"
DEFAULT_CATEGORIES = ["单词", "古诗", "成语", "文言文"]
BG_ALPHA = 50
REQUIRE_COUNT = 5  # 每天至少5条


# 初始化文件
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)
    if not os.path.exists(RECORD_FILE):
        with open(RECORD_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)


def load_record():
    with open(RECORD_FILE, "r", encoding="utf-8") as f:
        return json.load(f)


def save_record(record):
    with open(RECORD_FILE, "w", encoding="utf-8") as f:
        json.dump(record, f, ensure_ascii=False, indent=4)


def get_today():
    return datetime.now().strftime("%Y-%m-%d")


# 欢迎界面
class StartWindow:
    def __init__(self, root):
        self.root = root
        self.root.title("启动页")
        self.root.geometry("800x600")
        self.root.resizable(False, False)

        try:
            bg = Image.open(BG_IMAGE_NAME).convert("RGBA")
            bg = bg.resize((800, 600), Image.Resampling.LANCZOS)
            alpha = Image.new("L", bg.size, 70)
            bg.putalpha(alpha)
            self.photo = ImageTk.PhotoImage(bg)
            tk.Label(root, image=self.photo, bd=0).place(x=0, y=0, relwidth=1, relheight=1)
        except:
            self.root.config(bg="#faf7f0")

        # 文字
        tk.Label(root, text="东台市实验中学北海路校区",
                 font=("楷体", 24, "bold"), fg="#2d6a4f", bg="#fffdf5",
                 padx=20, pady=10).pack(pady=25)

        tk.Label(root, text="初一九班  冯辰 作品",
                 font=("楷体", 22, "bold"), fg="#1e402f", bg="#fffdf5",
                 padx=15, pady=8).pack(pady=10)

        tk.Label(root, text="好词好句日积月累",
                 font=("楷体", 28, "bold"), fg="#081c15", bg="#fffdf5",
                 padx=25, pady=12).pack(pady=30)

        tk.Label(root, text=f"每日打卡要求：累计不少于 {REQUIRE_COUNT} 条",
                 font=("楷体", 16), fg="#bc4749", bg="#fffdf5").pack(pady=5)

        tk.Button(root, text="进入打卡积累系统", font=("楷体", 18, "bold"),
                  bg="#40916c", fg="white", padx=30, pady=12, command=self.go_main) \
            .pack(pady=25)

    def go_main(self):
        self.root.destroy()
        r = tk.Tk()
        MainApp(r)
        r.mainloop()


# 主程序（打卡+积累）
class MainApp:
    def __init__(self, root):
        self.root = root
        self.root.title("好词好句打卡积累系统")
        self.root.geometry("850x680")
        self.root.resizable(False, False)

        # 背景
        try:
            bg = Image.open(BG_IMAGE_NAME).convert("RGBA")
            bg = bg.resize((850, 680), Image.Resampling.LANCZOS)
            alpha = Image.new("L", bg.size, BG_ALPHA)
            bg.putalpha(alpha)
            self.bg_img = ImageTk.PhotoImage(bg)
            tk.Label(root, image=self.bg_img, bd=0).place(x=0, y=0, relwidth=1, relheight=1)
        except:
            root.config(bg="#f5f2e9")

        # 今日打卡信息栏
        self.frame_top = tk.Frame(root, bg="#fdfbf2", bd=2, relief=tk.GROOVE, padx=10, pady=8)
        self.frame_top.pack(fill=tk.X, padx=30, pady=10)

        self.today_label = tk.Label(self.frame_top, text="", font=("楷体", 14), bg="#fdfbf2", fg="#333")
        self.today_label.pack(side=tk.LEFT, padx=10)

        self.status_label = tk.Label(self.frame_top, text="", font=("楷体", 14, "bold"), bg="#fdfbf2")
        self.status_label.pack(side=tk.RIGHT, padx=10)

        # 添加区域
        self.frame_add = tk.Frame(root, bg="#f5f2e9", padx=10, pady=8)
        self.frame_add.pack(fill=tk.X, padx=30, pady=5)

        tk.Label(self.frame_add, text="分类：", font=("楷体", 14), bg="#f5f2e9").grid(row=0, column=0)
        self.cate_var = tk.StringVar()
        cbox = ttk.Combobox(self.frame_add, textvariable=self.cate_var, values=DEFAULT_CATEGORIES,
                            font=("楷体", 13), width=10, state="readonly")
        cbox.grid(row=0, column=1, padx=5)
        cbox.current(0)

        tk.Label(self.frame_add, text="内容：", font=("楷体", 14), bg="#f5f2e9").grid(row=0, column=2, padx=5)
        self.entry_content = ttk.Entry(self.frame_add, font=("楷体", 14), width=38)
        self.entry_content.grid(row=0, column=3, padx=5)

        tk.Button(self.frame_add, text="添加", font=("楷体", 13), bg="#4a7c59", fg="white",
                  padx=12, command=self.add_item).grid(row=0, column=4, padx=5)

        # 筛选
        self.frame_search = tk.Frame(root, bg="#f5f2e9")
        self.frame_search.pack(fill=tk.X, padx=30, pady=5)

        tk.Label(self.frame_search, text="筛选：", font=("楷体", 13), bg="#f5f2e9").grid(row=0, column=0)
        self.f_var = tk.StringVar()
        f_cbox = ttk.Combobox(self.frame_search, textvariable=self.f_var, values=DEFAULT_CATEGORIES,
                              font=("楷体", 12), width=10, state="readonly")
        f_cbox.grid(row=0, column=1, padx=5)

        tk.Button(self.frame_search, text="筛选", font=("楷体", 12), bg="#6a994e", fg="white",
                  command=self.show_filter).grid(row=0, column=2, padx=4)
        tk.Button(self.frame_search, text="显示全部", font=("楷体", 12), bg="#6a994e", fg="white",
                  command=self.show_all).grid(row=0, column=3, padx=4)

        # 列表
        self.frame_list = tk.Frame(root, bg="#f5f2e9")
        self.frame_list.pack(fill=tk.BOTH, expand=True, padx=30, pady=8)

        scroll = ttk.Scrollbar(self.frame_list)
        scroll.pack(side=tk.RIGHT, fill=tk.Y)

        self.listbox = tk.Listbox(self.frame_list, font=("楷体", 14), yscrollcommand=scroll.set,
                                  bg="#f7fbf4", fg="#2a5936", bd=2, relief=tk.GROOVE,
                                  selectbackground="#a7c957", selectforeground="black")
        self.listbox.pack(fill=tk.BOTH, expand=True)
        scroll.config(command=self.listbox.yview)

        # 操作栏
        self.frame_btn = tk.Frame(root, bg="#f5f2e9")
        self.frame_btn.pack(pady=10)

        tk.Button(self.frame_btn, text="删除选中", font=("楷体", 13), bg="#bc4749", fg="white",
                  padx=12, command=self.delete_selected).grid(row=0, column=0, padx=8)
        tk.Button(self.frame_btn, text="在线搜索", font=("楷体", 13), bg="#386641", fg="white",
                  padx=12, command=self.search_online).grid(row=0, column=1, padx=8)
        tk.Button(self.frame_btn, text="刷新打卡", font=("楷体", 13), bg="#577590", fg="white",
                  padx=12, command=self.refresh_status).grid(row=0, column=2, padx=8)
        tk.Button(self.frame_btn, text="退出", font=("楷体", 13), bg="#6c757d", fg="white",
                  padx=12, command=root.quit).grid(row=0, column=3, padx=8)

        self.show_all()
        self.refresh_status()

    # 今日已添加数量
    def get_today_count(self):
        today = get_today()
        data = load_data()
        cnt = 0
        for d in data:
            if d.get("date") == today:
                cnt += 1
        return cnt

    # 刷新打卡状态
    def refresh_status(self):
        today = get_today()
        cnt = self.get_today_count()
        self.today_label.config(text=f"今天：{today}   已积累：{cnt} 条")
        if cnt >= REQUIRE_COUNT:
            self.status_label.config(text=f"✅ 今日打卡完成！", fg="#2d6a4f")
        else:
            self.status_label.config(text=f"❌ 还差 {REQUIRE_COUNT - cnt} 条", fg="#bc4749")

    # 添加
    def add_item(self):
        cate = self.cate_var.get()
        content = self.entry_content.get().strip()
        if not content:
            messagebox.showwarning("提示", "内容不能为空")
            return
        data = load_data()
        data.append({
            "分类": cate,
            "内容": content,
            "date": get_today()
        })
        save_data(data)
        self.entry_content.delete(0, tk.END)
        self.show_all()
        self.refresh_status()
        messagebox.showinfo("成功", "添加成功！")

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

    # 筛选
    def show_filter(self):
        cate = self.f_var.get()
        if not cate:
            messagebox.showwarning("提示", "请选择分类")
            return
        data = load_data()
        self.listbox.delete(0, tk.END)
        for i, d in enumerate(data, 1):
            if d["分类"] == cate:
                self.listbox.insert(tk.END, f"{i}.【{d['分类']}】{d['内容']}")

    # 删除
    def delete_selected(self):
        try:
            idx = self.listbox.curselection()[0]
            data = load_data()
            data.pop(idx)
            save_data(data)
            self.show_all()
            self.refresh_status()
        except:
            messagebox.showwarning("提示", "请选择一项")

    # 在线搜索
    def search_online(self):
        try:
            idx = self.listbox.curselection()[0]
            data = load_data()
            item = data[idx]
            webbrowser.open(f"https://www.baidu.com/s?wd={item['分类']}+{item['内容']}")
        except:
            messagebox.showwarning("提示", "请选择一项")


if __name__ == "__main__":
    try:
        from PIL import Image, ImageTk
    except:
        os.system("pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple")

    init_data()
    start = tk.Tk()
    StartWindow(start)
    start.mainloop()