import tkinter as tk
from tkinter import ttk, messagebox
import winsound
from datetime import date
import json
import os

# ---------- 配置 ----------
DEFAULT_WORK = 25
DEFAULT_BREAK = 5
MAX_STREAK = 4
TIME_FONT_SIZE = 48

mode = "work"
streak = 0
give_up = False

DATA_FILE = "pomodoro_data.json"

# ---------- 数据 ----------
def load_data():
    global streak
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE, "r", encoding="utf-8") as f:
            data = json.load(f)
            if data.get("date") == str(date.today()):
                streak = data.get("streak", 0)

def save_data():
    with open(DATA_FILE, "w", encoding="utf-8") as f:
        json.dump({
            "date": str(date.today()),
            "streak": streak
        }, f, ensure_ascii=False)

load_data()

# ---------- 音效 ----------
def play_sound():
    winsound.Beep(1000, 500)

# ---------- 计时 ----------
def get_times():
    try:
        work = int(entry_work.get())
        rest = int(entry_break.get())
        return work, rest
    except ValueError:
        messagebox.showerror("错误", "请输入有效分钟数")
        return DEFAULT_WORK, DEFAULT_BREAK

def start_pomodoro():
    global mode
    work, _ = get_times()
    mode = "work"
    countdown(work * 60)

def start_break():
    global mode
    _, rest = get_times()
    mode = "break"
    countdown(rest * 60)

def countdown(seconds):
    if give_up:
        return

    if seconds >= 0:
        mins, secs = divmod(seconds, 60)
        label_time.config(text=f"{mins:02d}:{secs:02d}")
        root.after(1000, countdown, seconds - 1)
    else:
        play_sound()
        if mode == "work":
            global streak
            streak += 1
            save_data()

            if streak >= MAX_STREAK:
                messagebox.showinfo(
                    "专注大师 🏆",
                    f"太强了！\n你已经连续完成 {streak} 个番茄！"
                )
                streak = 0
                save_data()
            else:
                messagebox.showinfo(
                    "挑战成功 🎉",
                    f"完成一个番茄！\n当前连续：{streak}/{MAX_STREAK}"
                )

            start_break()
        else:
            messagebox.showinfo("休息结束 ☕", "准备开始下一个番茄吧！")

# ---------- 字体 ----------
def increase_font():
    global TIME_FONT_SIZE
    TIME_FONT_SIZE += 6
    label_time.config(font=("Consolas", TIME_FONT_SIZE, "bold"))

def decrease_font():
    global TIME_FONT_SIZE
    TIME_FONT_SIZE = max(20, TIME_FONT_SIZE - 6)
    label_time.config(font=("Consolas", TIME_FONT_SIZE, "bold"))

# ---------- 关闭 ----------
def on_close():
    global give_up, streak
    give_up = True
    if mode == "work":
        streak = 0
        save_data()
        messagebox.showwarning("挑战失败", "中途退出，连续计数已清零！")
    root.destroy()

# ---------- UI ----------
root = tk.Tk()
root.title("🍅 番茄挑战计时器")
root.geometry("400x420")
root.resizable(False, False)
root.protocol("WM_DELETE_WINDOW", on_close)

bg_color = "#1e1e1e"
fg_color = "#ffffff"
accent = "#4CAF50"

root.config(bg=bg_color)

tk.Label(
    root,
    text="🍅 番茄挑战计时器",
    font=("微软雅黑", 18, "bold"),
    bg=bg_color,
    fg=accent
).pack(pady=10)

# 时间显示（超大）
label_time = tk.Label(
    root,
    text="25:00",
    font=("Consolas", TIME_FONT_SIZE, "bold"),
    bg=bg_color,
    fg=fg_color
)
label_time.pack(pady=15)

# 字体按钮
frame_font = tk.Frame(root, bg=bg_color)
frame_font.pack(pady=5)

tk.Button(frame_font, text="A+", command=increase_font,
          bg="#555", fg="white").pack(side=tk.LEFT, padx=8)
tk.Button(frame_font, text="A−", command=decrease_font,
          bg="#555", fg="white").pack(side=tk.LEFT, padx=8)

# 输入时间
frame_input = tk.Frame(root, bg=bg_color)
frame_input.pack(pady=15)

tk.Label(frame_input, text="工作（分钟）：", bg=bg_color,
         fg=fg_color).grid(row=0, column=0, padx=5)
entry_work = tk.Entry(frame_input, width=6)
entry_work.insert(0, str(DEFAULT_WORK))
entry_work.grid(row=0, column=1, padx=5)

tk.Label(frame_input, text="休息（分钟）：", bg=bg_color,
         fg=fg_color).grid(row=1, column=0, padx=5, pady=8)
entry_break = tk.Entry(frame_input, width=6)
entry_break.insert(0, str(DEFAULT_BREAK))
entry_break.grid(row=1, column=1, padx=5, pady=8)

# 按钮
frame_btn = tk.Frame(root, bg=bg_color)
frame_btn.pack(pady=20)

tk.Button(
    frame_btn,
    text="开始番茄 🍅",
    command=start_pomodoro,
    bg=accent,
    fg="white",
    width=14
).grid(row=0, column=0, padx=10)

tk.Button(
    frame_btn,
    text="强制休息 ☕",
    command=start_break,
    bg="#2196F3",
    fg="white",
    width=14
).grid(row=0, column=1, padx=10)

# 状态
tk.Label(
    root,
    text=f"今日连续：{streak}/{MAX_STREAK}",
    bg=bg_color,
    fg="#FFD700",
    font=("微软雅黑", 11)
).pack(pady=10)

root.mainloop()