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

# 数据文件
DATA_FILE = "birthday_data.txt"

# 初始化窗口
root = tk.Tk()
root.title("生日提醒器")
root.geometry("520x420")
root.resizable(False, False)

# ==================== 读写文件函数 ====================
def load_data():
    data = []
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE, "r", encoding="utf-8") as f:
            for line in f.readlines():
                line = line.strip()
                if line:
                    name, month, day, remark = line.split("|")
                    data.append([name, month, day, remark])
    return data

def save_data(arr):
    with open(DATA_FILE, "w", encoding="utf-8") as f:
        for item in arr:
            f.write(f"{item[0]}|{item[1]}|{item[2]}|{item[3]}\n")

birthday_list = load_data()

# ==================== 刷新表格 ====================
def refresh_table():
    # 清空表格
    for row in tree.get_children():
        tree.delete(row)
    # 填充数据
    for item in birthday_list:
        tree.insert("", tk.END, values=item)
    check_today_birthday()

# ==================== 检查今日生日 ====================
def check_today_birthday():
    now = datetime.now()
    cur_m = now.month
    cur_d = now.day
    today_people = []
    for item in birthday_list:
        m = int(item[1])
        d = int(item[2])
        if m == cur_m and d == cur_d:
            today_people.append(item[0])
    if today_people:
        msg = "🎂 今天过生日的人：\n" + "\n".join(today_people)
        messagebox.showinfo("生日提醒", msg)

# ==================== 添加生日 ====================
def add_birthday():
    name = entry_name.get().strip()
    month = entry_month.get().strip()
    day = entry_day.get().strip()
    remark = entry_remark.get().strip()

    if not name or not month or not day:
        messagebox.showwarning("提示", "姓名、月份、日期不能为空！")
        return
    try:
        m = int(month)
        d = int(day)
        if not (1 <= m <= 12 and 1 <= d <= 31):
            raise
    except:
        messagebox.showerror("错误", "月份1~12，日期1~31，请输入数字")
        return

    birthday_list.append([name, month, day, remark])
    save_data(birthday_list)
    refresh_table()
    # 清空输入框
    entry_name.delete(0, tk.END)
    entry_month.delete(0, tk.END)
    entry_day.delete(0, tk.END)
    entry_remark.delete(0, tk.END)

# ==================== 删除选中生日 ====================
def del_birthday():
    select = tree.selection()
    if not select:
        messagebox.showinfo("提示", "请先选中一条记录")
        return
    for item_id in select:
        idx = tree.index(item_id)
        del birthday_list[idx]
    save_data(birthday_list)
    refresh_table()

# ==================== 界面布局 ====================
# 输入区域
frame_input = tk.Frame(root, padx=10, pady=10)
frame_input.pack(fill="x")

tk.Label(frame_input, text="姓名：").grid(row=0, column=0, sticky="w")
entry_name = tk.Entry(frame_input, width=12)
entry_name.grid(row=0, column=1, padx=5)

tk.Label(frame_input, text="月份：").grid(row=0, column=2, sticky="w")
entry_month = tk.Entry(frame_input, width=6)
entry_month.grid(row=0, column=3, padx=5)

tk.Label(frame_input, text="日期：").grid(row=0, column=4, sticky="w")
entry_day = tk.Entry(frame_input, width=6)
entry_day.grid(row=0, column=5, padx=5)

tk.Label(frame_input, text="备注：").grid(row=1, column=0, sticky="w", pady=4)
entry_remark = tk.Entry(frame_input, width=35)
entry_remark.grid(row=1, column=1, columnspan=5, padx=5)

frame_btn = tk.Frame(root)
frame_btn.pack(pady=3)
tk.Button(frame_btn, text="添加生日", command=add_birthday, width=10).grid(row=0, column=0, padx=8)
tk.Button(frame_btn, text="删除选中", command=del_birthday, width=10).grid(row=0, column=1, padx=8)
tk.Button(frame_btn, text="查看今日生日", command=check_today_birthday, width=12).grid(row=0, column=2, padx=8)

# 表格展示
columns = ("name", "month", "day", "remark")
tree = ttk.Treeview(root, columns=columns, show="headings", height=12)
tree.heading("name", text="姓名")
tree.heading("month", text="月份")
tree.heading("day", text="日期")
tree.heading("remark", text="备注")
tree.column("name", width=120)
tree.column("month", width=70)
tree.column("day", width=70)
tree.column("remark", width=220)
tree.pack(padx=10, pady=5, fill="both")

refresh_table()
root.mainloop()