import tkinter as tk
from tkinter import ttk, messagebox
import time
import threading
import json
import os
from datetime import datetime

class StopwatchApp:
    def __init__(self, root):
        self.root = root
        self.root.title("专业秒表计时器")
        self.root.geometry("600x700")
        self.root.configure(bg='#f0f5ff')
        
        # 计时器状态
        self.is_running = False
        self.is_paused = False
        self.start_time = 0
        self.paused_time = 0
        self.elapsed_time = 0
        self.total_elapsed = 0
        self.laps = []
        self.current_lap = 0
        self.history = []
        
        # 加载历史记录
        self.load_history()
        
        # 创建界面
        self.setup_ui()
        
    def setup_ui(self):
        """设置用户界面"""
        # 主框架
        main_frame = ttk.Frame(self.root, padding="20")
        main_frame.pack(fill=tk.BOTH, expand=True)
        
        # 标题
        title_frame = ttk.Frame(main_frame)
        title_frame.pack(fill=tk.X, pady=(0, 20))
        
        title_label = tk.Label(title_frame, text="⏱️ 专业秒表计时器", 
                              font=("微软雅黑", 28, "bold"),
                              fg='#2c3e50', bg='#f0f5ff')
        title_label.pack()
        
        # 版本信息
        version_label = tk.Label(title_frame, text="v2.0", 
                                font=("微软雅黑", 10),
                                fg='#7f8c8d', bg='#f0f5ff')
        version_label.pack()
        
        # 时间显示区域
        self.setup_time_display(main_frame)
        
        # 控制按钮区域
        self.setup_controls(main_frame)
        
        # 计次/分段区域
        self.setup_laps_section(main_frame)
        
        # 历史记录区域
        self.setup_history_section(main_frame)
        
        # 状态栏
        self.setup_status_bar(main_frame)
        
    def setup_time_display(self, parent):
        """设置时间显示区域"""
        time_frame = ttk.Frame(parent, relief=tk.GROOVE, borderwidth=3)
        time_frame.pack(fill=tk.X, pady=(0, 20))
        
        # 主时间显示
        self.time_label = tk.Label(time_frame, text="00:00:00.00", 
                                  font=("Consolas", 60, "bold"),
                                  fg='#2980b9', bg='white',
                                  width=12, height=2, anchor='center')
        self.time_label.pack(pady=20, padx=20)
        
        # 当前圈数显示
        lap_frame = ttk.Frame(time_frame)
        lap_frame.pack(pady=(0, 20))
        
        ttk.Label(lap_frame, text="当前圈数:", font=("微软雅黑", 12)).pack(side=tk.LEFT, padx=5)
        self.lap_count_label = ttk.Label(lap_frame, text="0", 
                                        font=("Consolas", 16, "bold"),
                                        foreground='#e74c3c')
        self.lap_count_label.pack(side=tk.LEFT, padx=5)
        
    def setup_controls(self, parent):
        """设置控制按钮区域"""
        control_frame = ttk.Frame(parent)
        control_frame.pack(pady=(0, 20))
        
        # 第一行按钮
        row1_frame = ttk.Frame(control_frame)
        row1_frame.pack(pady=5)
        
        # 开始按钮
        self.start_button = tk.Button(row1_frame, text="▶ 开始", 
                                     font=("微软雅黑", 12, "bold"),
                                     bg='#27ae60', fg='white',
                                     width=10, height=2,
                                     command=self.start_timer,
                                     relief=tk.RAISED, bd=2)
        self.start_button.pack(side=tk.LEFT, padx=5)
        
        # 暂停按钮
        self.pause_button = tk.Button(row1_frame, text="⏸ 暂停", 
                                     font=("微软雅黑", 12, "bold"),
                                     bg='#f39c12', fg='white',
                                     width=10, height=2,
                                     command=self.pause_timer,
                                     relief=tk.RAISED, bd=2,
                                     state=tk.DISABLED)
        self.pause_button.pack(side=tk.LEFT, padx=5)
        
        # 停止按钮
        self.stop_button = tk.Button(row1_frame, text="■ 停止", 
                                    font=("微软雅黑", 12, "bold"),
                                    bg='#e74c3c', fg='white',
                                    width=10, height=2,
                                    command=self.stop_timer,
                                    relief=tk.RAISED, bd=2,
                                    state=tk.DISABLED)
        self.stop_button.pack(side=tk.LEFT, padx=5)
        
        # 第二行按钮
        row2_frame = ttk.Frame(control_frame)
        row2_frame.pack(pady=5)
        
        # 计次按钮
        self.lap_button = tk.Button(row2_frame, text="⏱️ 计次", 
                                   font=("微软雅黑", 11),
                                   bg='#3498db', fg='white',
                                   width=8, height=2,
                                   command=self.record_lap,
                                   relief=tk.RAISED, bd=2,
                                   state=tk.DISABLED)
        self.lap_button.pack(side=tk.LEFT, padx=5)
        
        # 重置按钮
        reset_button = tk.Button(row2_frame, text="↺ 重置", 
                               font=("微软雅黑", 11),
                               bg='#95a5a6', fg='white',
                               width=8, height=2,
                               command=self.reset_timer,
                               relief=tk.RAISED, bd=2)
        reset_button.pack(side=tk.LEFT, padx=5)
        
        # 保存记录按钮
        save_button = tk.Button(row2_frame, text="💾 保存", 
                              font=("微软雅黑", 11),
                              bg='#9b59b6', fg='white',
                              width=8, height=2,
                              command=self.save_current_session,
                              relief=tk.RAISED, bd=2)
        save_button.pack(side=tk.LEFT, padx=5)
        
    def setup_laps_section(self, parent):
        """设置计次/分段区域"""
        laps_frame = ttk.LabelFrame(parent, text="📊 计次记录", padding="10")
        laps_frame.pack(fill=tk.BOTH, expand=True, pady=(0, 20))
        
        # 创建Treeview
        columns = ("序号", "时间", "圈时", "与上圈差")
        self.laps_tree = ttk.Treeview(laps_frame, columns=columns, show="headings", height=8)
        
        # 设置列
        self.laps_tree.heading("序号", text="序号")
        self.laps_tree.heading("时间", text="时间")
        self.laps_tree.heading("圈时", text="圈时")
        self.laps_tree.heading("与上圈差", text="与上圈差")
        
        self.laps_tree.column("序号", width=60, anchor='center')
        self.laps_tree.column("时间", width=120, anchor='center')
        self.laps_tree.column("圈时", width=120, anchor='center')
        self.laps_tree.column("与上圈差", width=100, anchor='center')
        
        # 添加滚动条
        laps_scrollbar = ttk.Scrollbar(laps_frame, orient=tk.VERTICAL, command=self.laps_tree.yview)
        self.laps_tree.configure(yscrollcommand=laps_scrollbar.set)
        
        self.laps_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        laps_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
        # 计次操作按钮
        laps_btn_frame = ttk.Frame(laps_frame)
        laps_btn_frame.pack(fill=tk.X, pady=(5, 0))
        
        ttk.Button(laps_btn_frame, text="清空计次", 
                  command=self.clear_laps, width=10).pack(side=tk.LEFT, padx=2)
        
        # 统计信息
        self.stats_label = tk.Label(laps_btn_frame, text="计次: 0 | 最快: -- | 最慢: --",
                                   font=("微软雅黑", 9), fg='#7f8c8d')
        self.stats_label.pack(side=tk.RIGHT, padx=5)
        
    def setup_history_section(self, parent):
        """设置历史记录区域"""
        history_frame = ttk.LabelFrame(parent, text="📅 历史记录", padding="10")
        history_frame.pack(fill=tk.BOTH, expand=True, pady=(0, 20))
        
        # 创建Treeview
        columns = ("日期", "总时间", "计次数", "最快圈", "最慢圈")
        self.history_tree = ttk.Treeview(history_frame, columns=columns, show="headings", height=6)
        
        # 设置列
        self.history_tree.heading("日期", text="日期")
        self.history_tree.heading("总时间", text="总时间")
        self.history_tree.heading("计次数", text="计次数")
        self.history_tree.heading("最快圈", text="最快圈")
        self.history_tree.heading("最慢圈", text="最慢圈")
        
        self.history_tree.column("日期", width=150, anchor='center')
        self.history_tree.column("总时间", width=100, anchor='center')
        self.history_tree.column("计次数", width=80, anchor='center')
        self.history_tree.column("最快圈", width=100, anchor='center')
        self.history_tree.column("最慢圈", width=100, anchor='center')
        
        # 添加滚动条
        history_scrollbar = ttk.Scrollbar(history_frame, orient=tk.VERTICAL, command=self.history_tree.yview)
        self.history_tree.configure(yscrollcommand=history_scrollbar.set)
        
        self.history_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        history_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
        # 历史记录操作按钮
        history_btn_frame = ttk.Frame(history_frame)
        history_btn_frame.pack(fill=tk.X, pady=(5, 0))
        
        ttk.Button(history_btn_frame, text="删除选中", 
                  command=self.delete_history, width=10).pack(side=tk.LEFT, padx=2)
        ttk.Button(history_btn_frame, text="清空历史", 
                  command=self.clear_history, width=10).pack(side=tk.LEFT, padx=2)
        ttk.Button(history_btn_frame, text="加载选中", 
                  command=self.load_selected_history, width=10).pack(side=tk.LEFT, padx=2)
        
        # 刷新历史记录显示
        self.refresh_history_display()
        
    def setup_status_bar(self, parent):
        """设置状态栏"""
        self.status_bar = ttk.Label(parent, text="就绪 | 按F1查看帮助 | 按F2快速开始/暂停", 
                                   relief=tk.SUNKEN, anchor=tk.W, padding=5)
        self.status_bar.pack(fill=tk.X, pady=(0, 10))
        
        # 绑定快捷键
        self.root.bind('<F1>', lambda e: self.show_help())
        self.root.bind('<F2>', lambda e: self.toggle_start_pause())
        self.root.bind('<F3>', lambda e: self.record_lap())
        self.root.bind('<F4>', lambda e: self.reset_timer())
        
    def start_timer(self):
        """开始计时"""
        if not self.is_running:
            self.is_running = True
            self.is_paused = False
            
            if self.start_time == 0:  # 第一次开始
                self.start_time = time.time()
            elif self.paused_time > 0:  # 从暂停继续
                # 调整开始时间以补偿暂停时间
                pause_duration = time.time() - self.paused_time
                self.start_time += pause_duration
                self.paused_time = 0
            
            # 更新按钮状态
            self.start_button.config(text="▶ 运行中", bg='#16a085', state=tk.DISABLED)
            self.pause_button.config(state=tk.NORMAL, bg='#f39c12')
            self.stop_button.config(state=tk.NORMAL, bg='#e74c3c')
            self.lap_button.config(state=tk.NORMAL, bg='#3498db')
            
            # 创建计时器线程
            self.timer_thread = threading.Thread(target=self.timer_loop, daemon=True)
            self.timer_thread.start()
            
            self.update_status("计时器已启动")
    
    def pause_timer(self):
        """暂停计时"""
        if self.is_running and not self.is_paused:
            self.is_paused = True
            self.paused_time = time.time()
            
            # 更新按钮状态
            self.pause_button.config(text="▶ 继续", bg='#27ae60')
            self.start_button.config(state=tk.DISABLED)
            
            self.update_status("计时器已暂停")
        elif self.is_running and self.is_paused:
            # 继续计时
            self.is_paused = False
            # 调整开始时间以补偿暂停时间
            pause_duration = time.time() - self.paused_time
            self.start_time += pause_duration
            self.paused_time = 0
            
            # 更新按钮状态
            self.pause_button.config(text="⏸ 暂停", bg='#f39c12')
            
            self.update_status("计时器已继续")
    
    def stop_timer(self):
        """停止计时"""
        if self.is_running:
            self.is_running = False
            self.is_paused = False
            
            # 记录总用时
            if self.start_time > 0:
                end_time = time.time()
                if self.paused_time > 0:
                    end_time = self.paused_time
                self.total_elapsed = end_time - self.start_time
            
            # 更新按钮状态
            self.start_button.config(text="▶ 开始", bg='#27ae60', state=tk.NORMAL)
            self.pause_button.config(text="⏸ 暂停", bg='#f39c12', state=tk.DISABLED)
            self.stop_button.config(state=tk.DISABLED, bg='#e74c3c')
            self.lap_button.config(state=tk.DISABLED, bg='#7f8c8d')
            
            self.update_status(f"计时器已停止 | 总用时: {self.format_time(self.total_elapsed)}")
    
    def reset_timer(self):
        """重置计时器"""
        if messagebox.askyesno("确认重置", "确定要重置计时器吗？当前计次记录也会被清除。"):
            self.stop_timer()
            
            # 重置所有变量
            self.start_time = 0
            self.paused_time = 0
            self.elapsed_time = 0
            self.total_elapsed = 0
            self.current_lap = 0
            self.laps = []
            
            # 重置显示
            self.time_label.config(text="00:00:00.00")
            self.lap_count_label.config(text="0")
            
            # 清空计次列表
            for item in self.laps_tree.get_children():
                self.laps_tree.delete(item)
            
            # 更新统计信息
            self.update_stats()
            
            self.update_status("计时器已重置")
    
    def toggle_start_pause(self):
        """快速开始/暂停切换（快捷键）"""
        if not self.is_running:
            self.start_timer()
        elif self.is_running and not self.is_paused:
            self.pause_timer()
        elif self.is_running and self.is_paused:
            self.pause_timer()  # 实际上是继续
    
    def timer_loop(self):
        """计时器循环"""
        while self.is_running:
            if not self.is_paused:
                self.elapsed_time = time.time() - self.start_time
                
                # 在主线程中更新显示
                self.root.after(0, self.update_time_display, self.elapsed_time)
            
            time.sleep(0.01)  # 10ms更新一次，实现0.01秒精度
    
    def update_time_display(self, elapsed):
        """更新时间显示"""
        if not self.is_running:
            return
            
        time_str = self.format_time(elapsed)
        self.time_label.config(text=time_str)
        
        # 每过1分钟改变颜色
        minutes = int(elapsed // 60)
        if minutes > 0 and minutes % 2 == 0:
            self.time_label.config(fg='#e74c3c')  # 红色
        else:
            self.time_label.config(fg='#2980b9')  # 蓝色
    
    def format_time(self, seconds):
        """格式化时间显示"""
        hours = int(seconds // 3600)
        minutes = int((seconds % 3600) // 60)
        secs = int(seconds % 60)
        milliseconds = int((seconds - int(seconds)) * 100)
        
        return f"{hours:02d}:{minutes:02d}:{secs:02d}.{milliseconds:02d}"
    
    def record_lap(self):
        """记录圈时"""
        if not self.is_running:
            return
            
        current_time = time.time()
        lap_time = current_time - self.start_time
        
        if self.laps:
            last_lap_time = self.laps[-1]['total_time']
            lap_duration = lap_time - last_lap_time
        else:
            lap_duration = lap_time
        
        self.current_lap += 1
        
        lap_data = {
            'lap_number': self.current_lap,
            'total_time': lap_time,
            'lap_time': lap_duration,
            'timestamp': current_time
        }
        
        self.laps.append(lap_data)
        
        # 添加到Treeview
        lap_number = f"#{self.current_lap}"
        total_time_str = self.format_time(lap_time)
        lap_time_str = self.format_time(lap_duration)
        
        if self.current_lap > 1:
            prev_lap_time = self.laps[-2]['lap_time']
            diff = lap_duration - prev_lap_time
            if diff >= 0:
                diff_str = f"+{self.format_time(diff)}"
            else:
                diff_str = f"-{self.format_time(abs(diff))}"
        else:
            diff_str = "--"
        
        self.laps_tree.insert("", tk.END, values=(lap_number, total_time_str, lap_time_str, diff_str))
        
        # 滚动到底部
        self.laps_tree.yview_moveto(1)
        
        # 更新圈数显示
        self.lap_count_label.config(text=str(self.current_lap))
        
        # 更新统计信息
        self.update_stats()
        
        self.update_status(f"已记录第 {self.current_lap} 圈 | 圈时: {lap_time_str}")
    
    def clear_laps(self):
        """清空计次记录"""
        if not self.laps:
            return
            
        if messagebox.askyesno("确认清空", "确定要清空所有计次记录吗？"):
            self.laps.clear()
            self.current_lap = 0
            
            for item in self.laps_tree.get_children():
                self.laps_tree.delete(item)
            
            self.lap_count_label.config(text="0")
            self.update_stats()
            
            self.update_status("计次记录已清空")
    
    def update_stats(self):
        """更新统计信息"""
        if not self.laps:
            self.stats_label.config(text="计次: 0 | 最快: -- | 最慢: --")
            return
            
        lap_times = [lap['lap_time'] for lap in self.laps]
        fastest = min(lap_times)
        slowest = max(lap_times)
        
        self.stats_label.config(text=f"计次: {len(self.laps)} | 最快: {self.format_time(fastest)} | 最慢: {self.format_time(slowest)}")
    
    def save_current_session(self):
        """保存当前会话"""
        if not self.laps and self.total_elapsed == 0:
            messagebox.showwarning("无法保存", "没有可保存的数据！")
            return
            
        # 创建记录
        record = {
            'date': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            'total_time': self.total_elapsed if self.total_elapsed > 0 else self.elapsed_time,
            'lap_count': len(self.laps),
            'laps': self.laps.copy(),
            'fastest_lap': min([lap['lap_time'] for lap in self.laps]) if self.laps else 0,
            'slowest_lap': max([lap['lap_time'] for lap in self.laps]) if self.laps else 0
        }
        
        self.history.append(record)
        self.save_history()
        self.refresh_history_display()
        
        messagebox.showinfo("保存成功", f"记录已保存！\n总时间: {self.format_time(record['total_time'])}\n计次数: {record['lap_count']}")
        self.update_status(f"记录已保存: {record['date']}")
    
    def save_history(self):
        """保存历史记录到文件"""
        try:
            with open('stopwatch_history.json', 'w', encoding='utf-8') as f:
                json.dump(self.history, f, ensure_ascii=False, indent=2)
        except Exception as e:
            print(f"保存历史记录失败: {e}")
    
    def load_history(self):
        """从文件加载历史记录"""
        try:
            if os.path.exists('stopwatch_history.json'):
                with open('stopwatch_history.json', 'r', encoding='utf-8') as f:
                    self.history = json.load(f)
        except Exception as e:
            print(f"加载历史记录失败: {e}")
            self.history = []
    
    def refresh_history_display(self):
        """刷新历史记录显示"""
        # 清空现有显示
        for item in self.history_tree.get_children():
            self.history_tree.delete(item)
        
        # 添加新记录
        for record in reversed(self.history):  # 最新的在最上面
            fastest = self.format_time(record['fastest_lap']) if record['fastest_lap'] > 0 else "--"
            slowest = self.format_time(record['slowest_lap']) if record['slowest_lap'] > 0 else "--"
            
            self.history_tree.insert("", 0, values=(
                record['date'],
                self.format_time(record['total_time']),
                record['lap_count'],
                fastest,
                slowest
            ))
    
    def delete_history(self):
        """删除选中的历史记录"""
        selected = self.history_tree.selection()
        if not selected:
            messagebox.showwarning("提示", "请先选择一条记录")
            return
            
        if messagebox.askyesno("确认删除", f"确定要删除选中的 {len(selected)} 条记录吗？"):
            for item in selected:
                # 从Treeview获取日期
                date = self.history_tree.item(item)['values'][0]
                # 从history列表中删除
                self.history = [r for r in self.history if r['date'] != date]
                # 从Treeview中删除
                self.history_tree.delete(item)
            
            self.save_history()
            self.update_status(f"已删除 {len(selected)} 条历史记录")
    
    def clear_history(self):
        """清空所有历史记录"""
        if not self.history:
            return
            
        if messagebox.askyesno("确认清空", "确定要清空所有历史记录吗？此操作不可撤销！"):
            self.history.clear()
            for item in self.history_tree.get_children():
                self.history_tree.delete(item)
            
            self.save_history()
            self.update_status("历史记录已清空")
    
    def load_selected_history(self):
        """加载选中的历史记录"""
        selected = self.history_tree.selection()
        if not selected:
            messagebox.showwarning("提示", "请先选择一条记录")
            return
            
        item = selected[0]
        date = self.history_tree.item(item)['values'][0]
        
        # 查找对应的记录
        for record in self.history:
            if record['date'] == date:
                # 加载记录
                self.reset_timer()
                
                # 设置总时间
                self.total_elapsed = record['total_time']
                self.time_label.config(text=self.format_time(record['total_time']))
                
                # 加载计次
                self.laps = record['laps'].copy()
                self.current_lap = record['lap_count']
                
                # 清空并重新添加计次
                for item in self.laps_tree.get_children():
                    self.laps_tree.delete(item)
                
                for i, lap in enumerate(self.laps, 1):
                    lap_number = f"#{i}"
                    total_time_str = self.format_time(lap['total_time'])
                    lap_time_str = self.format_time(lap['lap_time'])
                    
                    if i > 1:
                        prev_lap_time = self.laps[i-2]['lap_time']
                        diff = lap['lap_time'] - prev_lap_time
                        if diff >= 0:
                            diff_str = f"+{self.format_time(diff)}"
                        else:
                            diff_str = f"-{self.format_time(abs(diff))}"
                    else:
                        diff_str = "--"
                    
                    self.laps_tree.insert("", tk.END, values=(lap_number, total_time_str, lap_time_str, diff_str))
                
                self.lap_count_label.config(text=str(self.current_lap))
                self.update_stats()
                
                self.update_status(f"已加载记录: {date}")
                return
    
    def show_help(self):
        """显示帮助信息"""
        help_text = """
🎯 快捷键操作:
• F1 - 显示帮助
• F2 - 开始/暂停计时
• F3 - 记录圈时
• F4 - 重置计时器

🎮 按钮功能:
• ▶ 开始 - 开始计时
• ⏸ 暂停 - 暂停计时
• ■ 停止 - 停止计时
• ⏱️ 计次 - 记录当前圈时
• ↺ 重置 - 重置计时器
• 💾 保存 - 保存当前记录

📊 计次功能:
• 记录每次的时间
• 显示与上一圈的差值
• 统计最快和最慢圈时

📅 历史记录:
• 自动保存历史记录
• 可加载之前的记录
• 支持删除和清空操作
        """
        messagebox.showinfo("使用帮助", help_text)
    
    def update_status(self, message):
        """更新状态栏"""
        self.status_bar.config(text=message)

def main():
    root = tk.Tk()
    app = StopwatchApp(root)
    
    # 设置窗口居中
    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'{width}x{height}+{x}+{y}')
    
    # 添加菜单
    menubar = tk.Menu(root)
    root.config(menu=menubar)
    
    # 文件菜单
    file_menu = tk.Menu(menubar, tearoff=0)
    menubar.add_cascade(label="文件", menu=file_menu)
    file_menu.add_command(label="保存记录", command=app.save_current_session)
    file_menu.add_separator()
    file_menu.add_command(label="退出", command=root.quit)
    
    # 工具菜单
    tools_menu = tk.Menu(menubar, tearoff=0)
    menubar.add_cascade(label="工具", menu=tools_menu)
    tools_menu.add_command(label="清空计次", command=app.clear_laps)
    tools_menu.add_command(label="清空历史", command=app.clear_history)
    
    # 帮助菜单
    help_menu = tk.Menu(menubar, tearoff=0)
    menubar.add_cascade(label="帮助", menu=help_menu)
    help_menu.add_command(label="使用帮助", command=app.show_help)
    help_menu.add_separator()
    help_menu.add_command(label="关于", command=lambda: messagebox.showinfo("关于", 
        "专业秒表计时器 v2.0\n\n功能：\n• 精确到0.01秒计时\n• 圈时记录功能\n• 历史记录保存\n• 快捷键支持\n• 统计信息显示"))
    
    root.mainloop()

if __name__ == "__main__":
    main()