import tkinter as tk
from tkinter import ttk, messagebox, font
import time
import threading
import winsound
import os
import json
from datetime import datetime, timedelta
import math

class TimerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("多功能定时器")
        self.root.geometry("900x700")
        self.root.configure(bg='#F5F5F5')
        
        # 设置图标
        try:
            self.root.iconbitmap('timer.ico')
        except:
            pass
        
        # 定时器状态
        self.timer_mode = "倒计时"  # 倒计时, 正计时, 秒表, 番茄钟, 间隔计时
        self.countdown_time = 0
        self.stopwatch_time = 0
        self.pomodoro_work_time = 25 * 60
        self.pomodoro_break_time = 5 * 60
        self.pomodoro_cycles = 4
        
        self.running = False
        self.paused = False
        self.start_time = 0
        self.elapsed_time = 0
        self.current_pomodoro = 0
        self.current_cycle = 0
        self.in_work_period = True
        
        # 预设时间
        self.presets = {
            "5分钟": 5 * 60,
            "10分钟": 10 * 60,
            "15分钟": 15 * 60,
            "20分钟": 20 * 60,
            "25分钟": 25 * 60,
            "30分钟": 30 * 60,
            "45分钟": 45 * 60,
            "1小时": 60 * 60,
            "1.5小时": 90 * 60,
            "2小时": 120 * 60
        }
        
        # 历史记录
        self.history = []
        self.load_history()
        
        # 自定义字体
        self.setup_fonts()
        
        # 创建界面
        self.setup_ui()
        
        # 更新显示
        self.update_display()
        
        # 加载设置
        self.load_settings()
    
    def setup_fonts(self):
        """设置字体"""
        # 数字字体
        self.digital_font = font.Font(family="Consolas", size=72, weight="bold")
        self.small_digital_font = font.Font(family="Consolas", size=24)
        
        # 标题字体
        self.title_font = font.Font(family="Microsoft YaHei", size=18, weight="bold")
        
        # 按钮字体
        self.button_font = font.Font(family="Microsoft YaHei", size=12)
    
    def setup_ui(self):
        """设置用户界面"""
        # 主容器
        main_container = tk.Frame(self.root, bg='#F5F5F5')
        main_container.pack(fill='both', expand=True, padx=20, pady=20)
        
        # 标题
        title_frame = tk.Frame(main_container, bg='#4A90E2')
        title_frame.pack(fill='x', pady=(0, 20))
        
        title_label = tk.Label(
            title_frame,
            text="⏰ 多功能定时器",
            font=("Microsoft YaHei", 24, "bold"),
            fg='white',
            bg='#4A90E2',
            pady=15
        )
        title_label.pack()
        
        # 主体内容
        content_frame = tk.Frame(main_container, bg='#FFFFFF', relief='ridge', bd=2)
        content_frame.pack(fill='both', expand=True)
        
        # 左侧控制面板
        self.setup_left_panel(content_frame)
        
        # 右侧显示面板
        self.setup_right_panel(content_frame)
    
    def setup_left_panel(self, parent):
        """设置左侧控制面板"""
        left_panel = tk.Frame(parent, bg='#FFFFFF', width=350)
        left_panel.pack(side='left', fill='y', padx=20, pady=20)
        left_panel.pack_propagate(False)
        
        # 模式选择
        mode_frame = tk.Frame(left_panel, bg='#FFFFFF')
        mode_frame.pack(fill='x', pady=(0, 20))
        
        tk.Label(
            mode_frame,
            text="定时器模式:",
            font=self.title_font,
            bg='#FFFFFF',
            fg='#333333'
        ).pack(anchor='w', pady=(0, 10))
        
        # 模式按钮容器
        mode_buttons_frame = tk.Frame(mode_frame, bg='#FFFFFF')
        mode_buttons_frame.pack(fill='x')
        
        modes = ["倒计时", "正计时", "秒表", "番茄钟", "间隔计时"]
        self.mode_buttons = []
        
        for i, mode in enumerate(modes):
            btn = tk.Button(
                mode_buttons_frame,
                text=mode,
                font=self.button_font,
                bg='#E0E0E0',
                fg='#333333',
                width=8,
                height=1,
                relief='flat',
                command=lambda m=mode: self.set_mode(m)
            )
            btn.pack(side='left', padx=2)
            self.mode_buttons.append(btn)
        
        # 时间设置
        time_frame = tk.Frame(left_panel, bg='#FFFFFF')
        time_frame.pack(fill='x', pady=(0, 20))
        
        tk.Label(
            time_frame,
            text="时间设置:",
            font=self.title_font,
            bg='#FFFFFF',
            fg='#333333'
        ).pack(anchor='w', pady=(0, 10))
        
        # 时间输入框
        time_input_frame = tk.Frame(time_frame, bg='#FFFFFF')
        time_input_frame.pack(fill='x')
        
        # 小时
        hour_frame = tk.Frame(time_input_frame, bg='#FFFFFF')
        hour_frame.pack(side='left', padx=5)
        
        tk.Label(hour_frame, text="小时", bg='#FFFFFF').pack()
        self.hour_var = tk.StringVar(value="00")
        hour_spinbox = ttk.Spinbox(
            hour_frame,
            from_=0,
            to=23,
            textvariable=self.hour_var,
            width=5,
            font=self.small_digital_font,
            command=self.update_time_from_spinbox
        )
        hour_spinbox.pack()
        
        # 分钟
        minute_frame = tk.Frame(time_input_frame, bg='#FFFFFF')
        minute_frame.pack(side='left', padx=5)
        
        tk.Label(minute_frame, text="分钟", bg='#FFFFFF').pack()
        self.minute_var = tk.StringVar(value="05")
        minute_spinbox = ttk.Spinbox(
            minute_frame,
            from_=0,
            to=59,
            textvariable=self.minute_var,
            width=5,
            font=self.small_digital_font,
            command=self.update_time_from_spinbox
        )
        minute_spinbox.pack()
        
        # 秒
        second_frame = tk.Frame(time_input_frame, bg='#FFFFFF')
        second_frame.pack(side='left', padx=5)
        
        tk.Label(second_frame, text="秒", bg='#FFFFFF').pack()
        self.second_var = tk.StringVar(value="00")
        second_spinbox = ttk.Spinbox(
            second_frame,
            from_=0,
            to=59,
            textvariable=self.second_var,
            width=5,
            font=self.small_digital_font,
            command=self.update_time_from_spinbox
        )
        second_spinbox.pack()
        
        # 预设时间
        preset_frame = tk.Frame(left_panel, bg='#FFFFFF')
        preset_frame.pack(fill='x', pady=(0, 20))
        
        tk.Label(
            preset_frame,
            text="预设时间:",
            font=self.title_font,
            bg='#FFFFFF',
            fg='#333333'
        ).pack(anchor='w', pady=(0, 10))
        
        # 预设按钮网格
        preset_buttons_frame = tk.Frame(preset_frame, bg='#FFFFFF')
        preset_buttons_frame.pack(fill='x')
        
        presets_list = list(self.presets.keys())
        for i in range(0, len(presets_list), 2):
            row_frame = tk.Frame(preset_buttons_frame, bg='#FFFFFF')
            row_frame.pack(fill='x', pady=2)
            
            for j in range(2):
                idx = i + j
                if idx < len(presets_list):
                    preset = presets_list[idx]
                    btn = tk.Button(
                        row_frame,
                        text=preset,
                        font=self.button_font,
                        bg='#E3F2FD',
                        fg='#1565C0',
                        width=12,
                        height=1,
                        relief='flat',
                        command=lambda p=preset: self.set_preset(p)
                    )
                    btn.pack(side='left', padx=2, expand=True, fill='x')
        
        # 番茄钟设置
        self.pomodoro_frame = tk.Frame(left_panel, bg='#FFFFFF')
        
        tk.Label(
            self.pomodoro_frame,
            text="番茄钟设置:",
            font=self.title_font,
            bg='#FFFFFF',
            fg='#333333'
        ).pack(anchor='w', pady=(0, 10))
        
        # 工作时间
        work_frame = tk.Frame(self.pomodoro_frame, bg='#FFFFFF')
        work_frame.pack(fill='x', pady=5)
        
        tk.Label(work_frame, text="工作时间(分钟):", bg='#FFFFFF', width=15).pack(side='left')
        self.work_time_var = tk.StringVar(value="25")
        work_spinbox = ttk.Spinbox(
            work_frame,
            from_=1,
            to=60,
            textvariable=self.work_time_var,
            width=8
        )
        work_spinbox.pack(side='left')
        
        # 休息时间
        break_frame = tk.Frame(self.pomodoro_frame, bg='#FFFFFF')
        break_frame.pack(fill='x', pady=5)
        
        tk.Label(break_frame, text="休息时间(分钟):", bg='#FFFFFF', width=15).pack(side='left')
        self.break_time_var = tk.StringVar(value="5")
        break_spinbox = ttk.Spinbox(
            break_frame,
            from_=1,
            to=30,
            textvariable=self.break_time_var,
            width=8
        )
        break_spinbox.pack(side='left')
        
        # 循环次数
        cycle_frame = tk.Frame(self.pomodoro_frame, bg='#FFFFFF')
        cycle_frame.pack(fill='x', pady=5)
        
        tk.Label(cycle_frame, text="循环次数:", bg='#FFFFFF', width=15).pack(side='left')
        self.cycle_var = tk.StringVar(value="4")
        cycle_spinbox = ttk.Spinbox(
            cycle_frame,
            from_=1,
            to=20,
            textvariable=self.cycle_var,
            width=8
        )
        cycle_spinbox.pack(side='left')
        
        # 间隔计时设置
        self.interval_frame = tk.Frame(left_panel, bg='#FFFFFF')
        
        tk.Label(
            self.interval_frame,
            text="间隔计时设置:",
            font=self.title_font,
            bg='#FFFFFF',
            fg='#333333'
        ).pack(anchor='w', pady=(0, 10))
        
        # 间隔数
        interval_count_frame = tk.Frame(self.interval_frame, bg='#FFFFFF')
        interval_count_frame.pack(fill='x', pady=5)
        
        tk.Label(interval_count_frame, text="间隔数:", bg='#FFFFFF', width=15).pack(side='left')
        self.interval_count_var = tk.StringVar(value="4")
        interval_spinbox = ttk.Spinbox(
            interval_count_frame,
            from_=2,
            to=20,
            textvariable=self.interval_count_var,
            width=8
        )
        interval_spinbox.pack(side='left')
        
        # 间隔时间
        interval_time_frame = tk.Frame(self.interval_frame, bg='#FFFFFF')
        interval_time_frame.pack(fill='x', pady=5)
        
        tk.Label(interval_time_frame, text="间隔时间(秒):", bg='#FFFFFF', width=15).pack(side='left')
        self.interval_time_var = tk.StringVar(value="30")
        interval_time_spinbox = ttk.Spinbox(
            interval_time_frame,
            from_=5,
            to=300,
            textvariable=self.interval_time_var,
            width=8
        )
        interval_time_spinbox.pack(side='left')
        
        # 控制按钮
        control_frame = tk.Frame(left_panel, bg='#FFFFFF')
        control_frame.pack(fill='x', pady=20)
        
        # 开始/暂停按钮
        self.start_button = tk.Button(
            control_frame,
            text="开始",
            command=self.start_timer,
            font=("Microsoft YaHei", 14, "bold"),
            bg='#4CAF50',
            fg='white',
            width=10,
            height=2,
            relief='flat'
        )
        self.start_button.pack(side='left', padx=5)
        
        # 重置按钮
        self.reset_button = tk.Button(
            control_frame,
            text="重置",
            command=self.reset_timer,
            font=("Microsoft YaHei", 14, "bold"),
            bg='#FF9800',
            fg='white',
            width=10,
            height=2,
            relief='flat'
        )
        self.reset_button.pack(side='left', padx=5)
        
        # 退出按钮
        exit_button = tk.Button(
            control_frame,
            text="退出",
            command=self.root.quit,
            font=("Microsoft YaHei", 14, "bold"),
            bg='#F44336',
            fg='white',
            width=10,
            height=2,
            relief='flat'
        )
        exit_button.pack(side='left', padx=5)
        
        # 音效设置
        sound_frame = tk.Frame(left_panel, bg='#FFFFFF')
        sound_frame.pack(fill='x', pady=10)
        
        self.sound_var = tk.BooleanVar(value=True)
        sound_check = tk.Checkbutton(
            sound_frame,
            text="启用提示音",
            variable=self.sound_var,
            bg='#FFFFFF',
            font=self.button_font
        )
        sound_check.pack(anchor='w')
        
        # 保存记录按钮
        save_button = tk.Button(
            left_panel,
            text="保存当前记录",
            command=self.save_current_record,
            font=self.button_font,
            bg='#2196F3',
            fg='white',
            width=15,
            relief='flat'
        )
        save_button.pack(pady=5)
    
    def setup_right_panel(self, parent):
        """设置右侧显示面板"""
        right_panel = tk.Frame(parent, bg='#FAFAFA')
        right_panel.pack(side='left', fill='both', expand=True, padx=(0, 20), pady=20)
        
        # 时间显示区域
        display_frame = tk.Frame(right_panel, bg='#212121', relief='solid', bd=2)
        display_frame.pack(fill='x', pady=(0, 20))
        
        self.time_display = tk.Label(
            display_frame,
            text="00:00:00",
            font=self.digital_font,
            fg='#00E676',
            bg='#212121',
            pady=30
        )
        self.time_display.pack()
        
        # 模式状态显示
        self.mode_label = tk.Label(
            display_frame,
            text="倒计时模式",
            font=("Microsoft YaHei", 16),
            fg='#BDBDBD',
            bg='#212121'
        )
        self.mode_label.pack(pady=(0, 10))
        
        # 进度条
        self.progress_frame = tk.Frame(right_panel, bg='#FAFAFA')
        self.progress_frame.pack(fill='x', pady=(0, 20))
        
        self.progress_label = tk.Label(
            self.progress_frame,
            text="进度: 0%",
            font=("Microsoft YaHei", 12),
            bg='#FAFAFA',
            fg='#333333'
        )
        self.progress_label.pack(anchor='w', pady=(0, 5))
        
        self.progress_bar = ttk.Progressbar(
            self.progress_frame,
            length=400,
            mode='determinate'
        )
        self.progress_bar.pack(fill='x')
        
        # 番茄钟状态
        self.pomodoro_status_frame = tk.Frame(right_panel, bg='#FAFAFA')
        
        self.pomodoro_status_label = tk.Label(
            self.pomodoro_status_frame,
            text="",
            font=("Microsoft YaHei", 14),
            bg='#FAFAFA',
            fg='#333333'
        )
        self.pomodoro_status_label.pack(anchor='w')
        
        # 间隔计时状态
        self.interval_status_frame = tk.Frame(right_panel, bg='#FAFAFA')
        
        self.interval_status_label = tk.Label(
            self.interval_status_frame,
            text="",
            font=("Microsoft YaHei", 14),
            bg='#FAFAFA',
            fg='#333333'
        )
        self.interval_status_label.pack(anchor='w')
        
        # 历史记录
        history_frame = tk.Frame(right_panel, bg='#FAFAFA')
        history_frame.pack(fill='both', expand=True)
        
        tk.Label(
            history_frame,
            text="历史记录:",
            font=("Microsoft YaHei", 16, "bold"),
            bg='#FAFAFA',
            fg='#333333'
        ).pack(anchor='w', pady=(0, 10))
        
        # 历史记录列表
        history_container = tk.Frame(history_frame, bg='#FFFFFF', relief='solid', bd=1)
        history_container.pack(fill='both', expand=True)
        
        # 创建滚动条
        history_scrollbar = tk.Scrollbar(history_container)
        history_scrollbar.pack(side='right', fill='y')
        
        # 创建列表框
        self.history_listbox = tk.Listbox(
            history_container,
            yscrollcommand=history_scrollbar.set,
            font=("Consolas", 10),
            bg='#FFFFFF',
            fg='#333333',
            selectbackground='#E3F2FD',
            selectforeground='#1565C0',
            activestyle='none'
        )
        self.history_listbox.pack(side='left', fill='both', expand=True)
        
        history_scrollbar.config(command=self.history_listbox.yview)
        
        # 清空历史按钮
        clear_button = tk.Button(
            history_frame,
            text="清空历史记录",
            command=self.clear_history,
            font=self.button_font,
            bg='#FF5252',
            fg='white',
            width=15,
            relief='flat'
        )
        clear_button.pack(anchor='e', pady=(10, 0))
    
    def set_mode(self, mode):
        """设置定时器模式"""
        self.timer_mode = mode
        self.reset_timer()
        
        # 更新模式标签
        self.mode_label.config(text=f"{mode}模式")
        
        # 高亮当前模式按钮
        for btn in self.mode_buttons:
            if btn['text'] == mode:
                btn.config(bg='#4A90E2', fg='white')
            else:
                btn.config(bg='#E0E0E0', fg='#333333')
        
        # 显示/隐藏特定设置
        if mode == "番茄钟":
            self.pomodoro_frame.pack(fill='x', pady=(0, 20))
            self.pomodoro_status_frame.pack(fill='x', pady=(0, 20))
            self.interval_status_frame.pack_forget()
            self.interval_frame.pack_forget()
        elif mode == "间隔计时":
            self.interval_frame.pack(fill='x', pady=(0, 20))
            self.interval_status_frame.pack(fill='x', pady=(0, 20))
            self.pomodoro_frame.pack_forget()
            self.pomodoro_status_frame.pack_forget()
        else:
            self.pomodoro_frame.pack_forget()
            self.pomodoro_status_frame.pack_forget()
            self.interval_frame.pack_forget()
            self.interval_status_frame.pack_forget()
        
        # 更新显示
        self.update_display()
    
    def set_preset(self, preset_name):
        """设置预设时间"""
        if preset_name in self.presets:
            total_seconds = self.presets[preset_name]
            hours = total_seconds // 3600
            minutes = (total_seconds % 3600) // 60
            seconds = total_seconds % 60
            
            self.hour_var.set(f"{hours:02d}")
            self.minute_var.set(f"{minutes:02d}")
            self.second_var.set(f"{seconds:02d}")
            
            self.update_time_from_spinbox()
    
    def update_time_from_spinbox(self):
        """从微调框更新时间"""
        try:
            hours = int(self.hour_var.get())
            minutes = int(self.minute_var.get())
            seconds = int(self.second_var.get())
            
            self.countdown_time = hours * 3600 + minutes * 60 + seconds
            
            # 更新显示
            self.update_display()
        except ValueError:
            pass
    
    def start_timer(self):
        """开始/暂停定时器"""
        if not self.running:
            # 开始定时器
            self.running = True
            self.paused = False
            self.start_time = time.time() - self.elapsed_time
            
            if self.timer_mode == "倒计时" and self.countdown_time <= 0:
                messagebox.showwarning("警告", "请设置倒计时时间！")
                self.running = False
                return
            
            self.start_button.config(text="暂停", bg='#FF9800')
            
            # 开始计时线程
            self.timer_thread = threading.Thread(target=self.timer_loop, daemon=True)
            self.timer_thread.start()
            
        elif not self.paused:
            # 暂停定时器
            self.paused = True
            self.start_button.config(text="继续", bg='#4CAF50')
        else:
            # 继续定时器
            self.paused = False
            self.start_time = time.time() - self.elapsed_time
            self.start_button.config(text="暂停", bg='#FF9800')
    
    def reset_timer(self):
        """重置定时器"""
        self.running = False
        self.paused = False
        self.elapsed_time = 0
        self.stopwatch_time = 0
        self.current_pomodoro = 0
        self.current_cycle = 0
        self.in_work_period = True
        
        self.start_button.config(text="开始", bg='#4CAF50')
        self.update_time_from_spinbox()
        self.update_display()
        
        # 重置进度条
        self.progress_bar['value'] = 0
        self.progress_label.config(text="进度: 0%")
        
        # 清空状态
        self.pomodoro_status_label.config(text="")
        self.interval_status_label.config(text="")
    
    def timer_loop(self):
        """定时器循环"""
        while self.running:
            if not self.paused:
                current_time = time.time()
                
                if self.timer_mode == "倒计时":
                    elapsed = current_time - self.start_time
                    remaining = max(0, self.countdown_time - elapsed)
                    
                    if remaining <= 0:
                        self.timer_finished()
                        break
                    
                    self.elapsed_time = elapsed
                    
                elif self.timer_mode == "正计时":
                    self.elapsed_time = current_time - self.start_time
                    
                elif self.timer_mode == "秒表":
                    self.stopwatch_time = current_time - self.start_time
                    
                elif self.timer_mode == "番茄钟":
                    self.update_pomodoro()
                    
                elif self.timer_mode == "间隔计时":
                    self.update_interval()
                
                # 更新显示
                self.root.after(0, self.update_display)
            
            time.sleep(0.1)  # 100ms更新一次
    
    def update_pomodoro(self):
        """更新番茄钟"""
        if self.in_work_period:
            total_time = int(self.work_time_var.get()) * 60
            period_name = "工作"
        else:
            total_time = int(self.break_time_var.get()) * 60
            period_name = "休息"
        
        cycle = self.current_cycle + 1
        total_cycles = int(self.cycle_var.get())
        
        if self.current_pomodoro == 0:
            self.start_time = time.time()
            self.current_pomodoro = self.start_time
        
        elapsed = time.time() - self.current_pomodoro
        remaining = max(0, total_time - elapsed)
        
        if remaining <= 0:
            # 当前阶段结束
            if self.sound_var.get():
                self.play_sound()
            
            if self.in_work_period:
                # 工作时间结束，开始休息
                self.in_work_period = False
                self.current_pomodoro = time.time()
                self.add_to_history(f"第{cycle}轮工作完成")
            else:
                # 休息时间结束，开始下一轮工作
                self.in_work_period = True
                self.current_cycle += 1
                self.current_pomodoro = time.time()
                self.add_to_history(f"第{cycle}轮休息完成")
                
                if self.current_cycle >= total_cycles:
                    # 所有循环完成
                    self.timer_finished("番茄钟完成！")
                    return
            
            # 显示通知
            if self.in_work_period:
                next_period = "工作"
            else:
                next_period = "休息"
            
            message = f"{period_name}时间结束！开始{next_period}时间"
            self.root.after(0, lambda: messagebox.showinfo("番茄钟", message))
        
        self.elapsed_time = elapsed
    
    def update_interval(self):
        """更新间隔计时"""
        try:
            interval_count = int(self.interval_count_var.get())
            interval_time = int(self.interval_time_var.get())
            
            if self.current_cycle == 0:
                self.start_time = time.time()
                self.current_pomodoro = self.start_time
                self.current_cycle = 1
            
            elapsed = time.time() - self.current_pomodoro
            current_interval = min(self.current_cycle, interval_count)
            interval_progress = elapsed / interval_time
            
            if interval_progress >= 1:
                # 当前间隔结束
                if self.sound_var.get():
                    self.play_sound()
                
                self.add_to_history(f"间隔{current_interval}完成")
                self.current_cycle += 1
                self.current_pomodoro = time.time()
                
                if self.current_cycle > interval_count:
                    # 所有间隔完成
                    self.timer_finished("间隔计时完成！")
                    return
            
            self.elapsed_time = elapsed
        except ValueError:
            pass
    
    def timer_finished(self, custom_message=None):
        """定时器完成"""
        self.running = False
        
        if self.sound_var.get():
            self.play_sound()
        
        # 播放完成声音
        if self.sound_var.get():
            try:
                for _ in range(3):
                    winsound.Beep(1000, 300)
                    time.sleep(0.1)
            except:
                pass
        
        # 显示完成消息
        if custom_message:
            message = custom_message
        else:
            if self.timer_mode == "倒计时":
                message = "倒计时结束！"
            elif self.timer_mode == "番茄钟":
                message = "番茄钟完成！"
            elif self.timer_mode == "间隔计时":
                message = "间隔计时完成！"
            else:
                message = "计时完成！"
        
        self.root.after(0, lambda: messagebox.showinfo("定时器", message))
        
        # 保存记录
        if self.timer_mode == "倒计时":
            self.add_to_history(f"倒计时: {self.format_time(self.countdown_time)}")
        elif self.timer_mode == "正计时":
            self.add_to_history(f"正计时: {self.format_time(self.elapsed_time)}")
        elif self.timer_mode == "秒表":
            self.add_to_history(f"秒表: {self.format_time(self.stopwatch_time)}")
        
        # 重置按钮状态
        self.start_button.config(text="开始", bg='#4CAF50')
    
    def play_sound(self):
        """播放提示音"""
        try:
            winsound.Beep(800, 200)
        except:
            pass
    
    def update_display(self):
        """更新显示"""
        if self.timer_mode == "倒计时":
            remaining = max(0, self.countdown_time - self.elapsed_time)
            time_str = self.format_time(remaining)
            
            # 更新进度条
            if self.countdown_time > 0:
                progress = ((self.countdown_time - remaining) / self.countdown_time) * 100
                self.progress_bar['value'] = progress
                self.progress_label.config(text=f"进度: {progress:.1f}%")
            
        elif self.timer_mode == "正计时":
            time_str = self.format_time(self.elapsed_time)
            
        elif self.timer_mode == "秒表":
            time_str = self.format_time(self.stopwatch_time)
            
        elif self.timer_mode == "番茄钟":
            if self.in_work_period:
                total_time = int(self.work_time_var.get()) * 60
                period_name = "工作"
            else:
                total_time = int(self.break_time_var.get()) * 60
                period_name = "休息"
            
            remaining = max(0, total_time - self.elapsed_time)
            time_str = self.format_time(remaining)
            
            # 更新番茄钟状态
            cycle = self.current_cycle + 1
            total_cycles = int(self.cycle_var.get())
            status_text = f"第{cycle}/{total_cycles}轮 {period_name}时间"
            self.pomodoro_status_label.config(text=status_text)
            
            # 更新进度条
            if total_time > 0:
                progress = (self.elapsed_time / total_time) * 100
                self.progress_bar['value'] = progress
                self.progress_label.config(text=f"进度: {progress:.1f}%")
            
        elif self.timer_mode == "间隔计时":
            try:
                interval_time = int(self.interval_time_var.get())
                interval_count = int(self.interval_count_var.get())
                
                elapsed_in_interval = self.elapsed_time % interval_time
                remaining_in_interval = max(0, interval_time - elapsed_in_interval)
                time_str = self.format_time(remaining_in_interval)
                
                # 更新间隔计时状态
                current_interval = min(self.current_cycle, interval_count)
                status_text = f"间隔 {current_interval}/{interval_count}"
                self.interval_status_label.config(text=status_text)
                
                # 更新进度条
                progress = (elapsed_in_interval / interval_time) * 100
                self.progress_bar['value'] = progress
                self.progress_label.config(text=f"进度: {progress:.1f}%")
            except ValueError:
                time_str = "00:00:00"
        
        else:
            time_str = "00:00:00"
        
        # 更新时间显示
        self.time_display.config(text=time_str)
        
        # 改变颜色表示状态
        if self.timer_mode == "倒计时" and self.running:
            remaining_seconds = max(0, self.countdown_time - self.elapsed_time)
            if remaining_seconds <= 10:  # 最后10秒变红色
                self.time_display.config(fg='#FF5252')
            else:
                self.time_display.config(fg='#00E676')
        else:
            self.time_display.config(fg='#00E676')
    
    def format_time(self, seconds):
        """格式化时间显示"""
        if seconds < 0:
            seconds = 0
        
        hours = int(seconds // 3600)
        minutes = int((seconds % 3600) // 60)
        secs = int(seconds % 60)
        
        if hours > 0:
            return f"{hours:02d}:{minutes:02d}:{secs:02d}"
        else:
            return f"{minutes:02d}:{secs:02d}"
    
    def add_to_history(self, record):
        """添加到历史记录"""
        timestamp = datetime.now().strftime("%H:%M:%S")
        full_record = f"[{timestamp}] {record}"
        
        self.history.append(full_record)
        self.history_listbox.insert(0, full_record)
        
        # 保存历史记录
        self.save_history()
    
    def save_current_record(self):
        """保存当前记录"""
        if self.timer_mode == "倒计时" and self.countdown_time > 0:
            self.add_to_history(f"倒计时设置: {self.format_time(self.countdown_time)}")
        elif self.timer_mode == "正计时" and self.elapsed_time > 0:
            self.add_to_history(f"正计时: {self.format_time(self.elapsed_time)}")
        elif self.timer_mode == "秒表" and self.stopwatch_time > 0:
            self.add_to_history(f"秒表: {self.format_time(self.stopwatch_time)}")
        elif self.timer_mode == "番茄钟":
            work_time = int(self.work_time_var.get())
            break_time = int(self.break_time_var.get())
            cycles = int(self.cycle_var.get())
            self.add_to_history(f"番茄钟设置: {work_time}分工作/{break_time}分休息 ×{cycles}轮")
        else:
            messagebox.showinfo("提示", "没有可保存的计时记录")
    
    def save_history(self):
        """保存历史记录到文件"""
        try:
            with open("timer_history.json", "w", encoding='utf-8') as f:
                json.dump(self.history, f, ensure_ascii=False, indent=2)
        except:
            pass
    
    def load_history(self):
        """从文件加载历史记录"""
        try:
            if os.path.exists("timer_history.json"):
                with open("timer_history.json", "r", encoding='utf-8') as f:
                    self.history = json.load(f)
                    
                    # 添加到列表框
                    for record in reversed(self.history[-50:]):  # 只显示最近的50条
                        self.history_listbox.insert(0, record)
        except:
            self.history = []
    
    def clear_history(self):
        """清空历史记录"""
        if messagebox.askyesno("确认", "确定要清空历史记录吗？"):
            self.history.clear()
            self.history_listbox.delete(0, tk.END)
            self.save_history()
    
    def save_settings(self):
        """保存设置"""
        settings = {
            "sound_enabled": self.sound_var.get(),
            "last_mode": self.timer_mode,
            "hour": self.hour_var.get(),
            "minute": self.minute_var.get(),
            "second": self.second_var.get()
        }
        
        try:
            with open("timer_settings.json", "w") as f:
                json.dump(settings, f)
        except:
            pass
    
    def load_settings(self):
        """加载设置"""
        try:
            if os.path.exists("timer_settings.json"):
                with open("timer_settings.json", "r") as f:
                    settings = json.load(f)
                    
                    if "sound_enabled" in settings:
                        self.sound_var.set(settings["sound_enabled"])
                    
                    if "last_mode" in settings:
                        self.set_mode(settings["last_mode"])
                    
                    if "hour" in settings:
                        self.hour_var.set(settings["hour"])
                    
                    if "minute" in settings:
                        self.minute_var.set(settings["minute"])
                    
                    if "second" in settings:
                        self.second_var.set(settings["second"])
                        
                    self.update_time_from_spinbox()
        except:
            pass
    
    def on_closing(self):
        """窗口关闭事件"""
        self.save_settings()
        self.save_history()
        self.root.quit()

def main():
    root = tk.Tk()
    app = TimerApp(root)
    
    # 设置关闭事件
    root.protocol("WM_DELETE_WINDOW", app.on_closing)
    
    # 设置窗口居中
    root.update_idletasks()
    width = root.winfo_width()
    height = root.winfo_height()
    x = (root.winfo_screenwidth() // 2) - (width // 2)
    y = (root.winfo_screenheight() // 2) - (height // 2)
    root.geometry(f'900x700+{x}+{y}')
    
    root.mainloop()

if __name__ == "__main__":
    main()