import tkinter as tk
from tkinter import ttk, messagebox
import json
from datetime import datetime

# 存储文件
DATA_FILE = "birthday_data.json"

class BirthdayReminder:
    def __init__(self, root):
        self.root = root
        self.root.title("生日提醒器")
        self.root.geometry("620x460")
        self.root.resizable(False, False)

        # 加载本地生日数据
        self.birthday_list = self.load_data()

        # 顶部输入区域
        input_frame = tk.Frame(root)
        input_frame.pack(pady=10)

        tk.Label(input_frame, text="姓名：").grid(row=0, column=0, padx=5)
        self.entry_name = tk.Entry(input_frame, width=12, font=("微软雅黑", 10))
        self.entry_name.grid(row=0, column=1, padx=5)

        tk.Label(input_frame, text="生日(月-日)：").grid(row=0, column=2, padx=5)
        self.entry_birth = tk.Entry(input_frame, width=12, font=("微软雅黑", 10))
        self.entry_birth.grid(row=0, column=3, padx=5)
        tk.Label(input_frame, text="格式：08-15", fg="#666").grid(row=1, column=3)

        # 功能按钮行
        btn_frame = tk.Frame(root)
        btn_frame.pack(pady=5)
        tk.Button(btn_frame, text="添加", command=self.add_birth, bg="#2196F3", fg="white", width=8).grid(row=0, column=0, padx=4)
        tk.Button(btn_frame, text="查看全部", command=self.refresh_table, bg="#4CAF50", fg="white", width=8).grid(row=0, column=1, padx=4)
        tk.Button(btn_frame, text="查看最近7天生日", command=self.show_near_birth, bg="#FF9800", fg="white", width=12).grid(row=0, column=2, padx=4)
        tk.Button(btn_frame, text="删除选中", command=self.delete_item, bg="#f44336", fg="white", width=8).grid(row=0, column=3, padx=4)

        # 表格展示区域
        table_frame = tk.Frame(root)
        table_frame.pack(pady=10)
        columns = ("name", "birth")
        self.table = ttk.Treeview(table_frame, columns=columns, show="headings", height=12)
        self.table.heading("name", text="姓名")
        self.table.heading("birth", text="生日(月-日)")
        self.table.column("name", width=220, anchor="center")
        self.table.column("birth", width=220, anchor="center")
        self.table.pack()

        # 底部清空按钮
        tk.Button(root, text="清空所有记录", command=self.clear_all, bg="#333", fg="white").pack(pady=5)

        # 初始化刷新表格
        self.refresh_table()

    def load_data(self):
        """读取本地json文件，无文件则返回空列表"""
        try:
            with open(DATA_FILE, "r", encoding="utf-8") as f:
                return json.load(f)
        except (FileNotFoundError, json.JSONDecodeError):
            return []

    def save_data(self):
        """保存数据到本地文件"""
        with open(DATA_FILE, "w", encoding="utf-8") as f:
            json.dump(self.birthday_list, f, ensure_ascii=False, indent=2)

    def add_birth(self):
        """新增生日记录"""
        name = self.entry_name.get().strip()
        birth = self.entry_birth.get().strip()
        if not name or not birth:
            messagebox.showwarning("提示", "姓名和生日不能为空")
            return
        # 校验日期格式
        try:
            datetime.strptime(birth, "%m-%d")
        except ValueError:
            messagebox.showerror("格式错误", "生日必须为 月-日 例如：09-27")
            return

        self.birthday_list.append({"name": name, "birth": birth})
        self.save_data()
        # 清空输入框
        self.entry_name.delete(0, tk.END)
        self.entry_birth.delete(0, tk.END)
        self.refresh_table()
        messagebox.showinfo("成功", "生日添加完成")

    def refresh_table(self):
        """刷新表格所有数据"""
        # 清空旧表格
        for row in self.table.get_children():
            self.table.delete(row)
        # 填充数据
        for item in self.birthday_list:
            self.table.insert("", tk.END, values=(item["name"], item["birth"]))

    def delete_item(self):
        """删除表格选中行"""
        select_row = self.table.selection()
        if not select_row:
            messagebox.showinfo("提示", "请先选中要删除的记录")
            return
        index = self.table.index(select_row[0])
        del self.birthday_list[index]
        self.save_data()
        self.refresh_table()

    def clear_all(self):
        """清空全部生日数据"""
        if messagebox.askyesno("确认", "确定要删除所有生日记录吗？无法恢复！"):
            self.birthday_list = []
            self.save_data()
            self.refresh_table()

    def show_near_birth(self):
        """筛选未来7天内过生日的人"""
        today = datetime.now()
        near_people = []
        for person in self.birthday_list:
            month, day = map(int, person["birth"].split("-"))
            try:
                # 生日设为今年
                birth_this_year = datetime(year=today.year, month=month, day=day)
                diff_days = (birth_this_year - today).days
                # 生日在今天往后7天内，或是跨年（12月底生日）
                if 0 <= diff_days <= 7:
                    near_people.append(f"{person['name']} | {person['birth']} 还有{diff_days}天")
                elif diff_days < -350:
                    near_people.append(f"{person['name']} | {person['birth']} 跨年即将到期")
            except:
                continue
        if near_people:
            msg = "未来7天过生日名单：\n" + "\n".join(near_people)
        else:
            msg = "最近7天没有人生日"
        messagebox.showinfo("生日提醒", msg)

if __name__ == "__main__":
    window = tk.Tk()
    app = BirthdayReminder(window)
    window.mainloop()