from tkinter import *
from tkinter import messagebox
from datetime import datetime

FILE = "birthday.txt"

# 加载生日数据
def load_data():
    data = []
    try:
        with open(FILE, "r", encoding="utf-8") as f:
            for line in f.readlines():
                line = line.strip()
                if line:
                    name, birth, note = line.split("|")
                    data.append([name, birth, note])
    except FileNotFoundError:
        open(FILE, "w", encoding="utf-8").close()
    return data

# 保存生日
def save_data(name, birth, note):
    with open(FILE, "a", encoding="utf-8") as f:
        f.write(f"{name}|{birth}|{note}\n")

# 计算距离生日天数
def get_days(birth_str):
    today = datetime.now()
    y = today.year
    m, d = map(int, birth_str.split("-"))
    try:
        next_b = datetime(y, m, d)
    except:
        return -1
    if next_b < today:
        next_b = datetime(y + 1, m, d)
    return (next_b - today).days

# 添加生日按钮事件
def add_birth():
    name = entry_name.get().strip()
    birth = entry_birth.get().strip()
    note = entry_note.get().strip()
    if not name or not birth:
        messagebox.showwarning("提示", "姓名和生日不能为空！")
        return
    # 校验日期
    try:
        mm, dd = map(int, birth.split("-"))
        datetime(2000, mm, dd)
    except:
        messagebox.showerror("格式错误", "生日格式为 月-日，示例：09-10")
        return
    save_data(name, birth, note)
    messagebox.showinfo("成功", "生日信息已保存！")
    entry_name.delete(0, END)
    entry_birth.delete(0, END)
    entry_note.delete(0, END)

# 查看今日生日
def show_today():
    today = datetime.now().strftime("%m-%d")
    lst = load_data()
    res = "=== 今日寿星 ===\n"
    flag = False
    for item in lst:
        n, b, nt = item
        if b == today:
            flag = True
            res += f"🎉 {n} | {b} | {nt}\n"
    if not flag:
        res += "今天没有人生日"
    text_box.delete(1.0, END)
    text_box.insert(END, res)

# 查看全部生日+倒计时
def show_all():
    lst = load_data()
    text_box.delete(1.0, END)
    if not lst:
        text_box.insert(END, "暂无生日记录，请先添加！")
        return
    out = f"{'姓名':<8}{'生日':<8}{'剩余天数':<10}{'备注'}\n" + "-"*40 + "\n"
    for item in lst:
        n, b, nt = item
        days = get_days(b)
        if days == 0:
            day_txt = "今日生日"
        else:
            day_txt = f"{days}天"
        out += f"{n:<8}{b:<8}{day_txt:<10}{nt}\n"
    text_box.insert(END, out)

# 创建主窗口
root = Tk()
root.title("生日提醒器")
root.geometry("520x420")
root.resizable(False, False)

# 输入区域框架
frame_input = Frame(root, pady=10)
frame_input.pack()

Label(frame_input, text="姓名：").grid(row=0, column=0, sticky=W, pady=4)
entry_name = Entry(frame_input, width=22)
entry_name.grid(row=0, column=1, padx=8)

Label(frame_input, text="生日(月-日)：").grid(row=1, column=0, sticky=W, pady=4)
entry_birth = Entry(frame_input, width=22)
entry_birth.grid(row=1, column=1, padx=8)

Label(frame_input, text="备注：").grid(row=2, column=0, sticky=W, pady=4)
entry_note = Entry(frame_input, width=22)
entry_note.grid(row=2, column=1, padx=8)

# 按钮框架
frame_btn = Frame(root, pady=5)
frame_btn.pack()

Button(frame_btn, text="添加生日", width=10, command=add_birth).grid(row=0, column=0, padx=6)
Button(frame_btn, text="查看今日生日", width=10, command=show_today).grid(row=0, column=1, padx=6)
Button(frame_btn, text="查看全部生日", width=10, command=show_all).grid(row=0, column=2, padx=6)

# 显示文本框
Label(root, text="信息展示区：").pack()
text_box = Text(root, width=62, height=14)
text_box.pack(pady=4)

root.mainloop()