"""
瑜伽学习软件 - 图形界面版
Yoga Learning Application with GUI
使用 Tkinter 构建界面
"""

import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
import json
import os
import time
from datetime import datetime
from typing import List, Dict
import threading
import random

class YogaPose:
    """瑜伽姿势类"""
    def __init__(self, name: str, category: str, difficulty: int, 
                 benefits: List[str], instructions: List[str], duration: int = 60):
        self.name = name
        self.category = category
        self.difficulty = difficulty
        self.benefits = benefits
        self.instructions = instructions
        self.duration = duration
        
    def to_dict(self) -> Dict:
        return {
            "name": self.name,
            "category": self.category,
            "difficulty": self.difficulty,
            "benefits": self.benefits,
            "instructions": self.instructions,
            "duration": self.duration
        }
    
    @classmethod
    def from_dict(cls, data: Dict) -> 'YogaPose':
        return cls(
            name=data["name"],
            category=data["category"],
            difficulty=data["difficulty"],
            benefits=data["benefits"],
            instructions=data["instructions"],
            duration=data.get("duration", 60)
        )

class YogaSession:
    """瑜伽课程类"""
    def __init__(self, name: str, poses: List[YogaPose], 
                 difficulty: int, duration: int, focus_area: str = ""):
        self.name = name
        self.poses = poses
        self.difficulty = difficulty
        self.duration = duration
        self.focus_area = focus_area
        
    def to_dict(self) -> Dict:
        return {
            "name": self.name,
            "poses": [pose.to_dict() for pose in self.poses],
            "difficulty": self.difficulty,
            "duration": self.duration,
            "focus_area": self.focus_area
        }

class YogaProgress:
    """学习进度追踪"""
    def __init__(self):
        self.sessions_completed: List[Dict] = []
        self.total_minutes = 0
        self.total_sessions = 0
        self.streak_days = 0
        self.last_practice_date = None
        self.achievements: List[str] = []
        
    def add_session(self, session_name: str, duration: int, difficulty: int):
        today = datetime.now().strftime("%Y-%m-%d")
        
        if self.last_practice_date:
            last_date = datetime.strptime(self.last_practice_date, "%Y-%m-%d")
            today_date = datetime.strptime(today, "%Y-%m-%d")
            days_diff = (today_date - last_date).days
            if days_diff == 1:
                self.streak_days += 1
            elif days_diff > 1:
                self.streak_days = 1
        else:
            self.streak_days = 1
            
        self.last_practice_date = today
        self.total_sessions += 1
        self.total_minutes += duration
        
        self.sessions_completed.append({
            "name": session_name,
            "duration": duration,
            "difficulty": difficulty,
            "date": today
        })
        
        self._check_achievements()
        
    def _check_achievements(self):
        if self.total_minutes >= 100 and "百分钟瑜伽" not in self.achievements:
            self.achievements.append("百分钟瑜伽 🌟")
        if self.total_sessions >= 10 and "十次练习" not in self.achievements:
            self.achievements.append("十次练习 🏆")
        if self.streak_days >= 7 and "七日坚持" not in self.achievements:
            self.achievements.append("七日坚持 🔥")
        if self.total_minutes >= 500 and "五百分钟达人" not in self.achievements:
            self.achievements.append("五百分钟达人 💪")
            
    def get_stats(self) -> Dict:
        return {
            "total_sessions": self.total_sessions,
            "total_minutes": self.total_minutes,
            "streak_days": self.streak_days,
            "achievements": self.achievements,
            "last_practice": self.last_practice_date
        }

class YogaAppGUI:
    """瑜伽学习应用GUI主类"""
    
    def __init__(self, root):
        self.root = root
        self.root.title("🧘 瑜伽学习软件")
        self.root.geometry("1100x750")
        self.root.resizable(True, True)
        
        # 初始化数据
        self.pose_library: Dict[str, YogaPose] = {}
        self.sessions: List[YogaSession] = []
        self.progress = YogaProgress()
        self.data_file = "yoga_data.json"
        self.current_session = None
        self.is_practicing = False
        self.timer_running = False
        
        # 颜色主题
        self.colors = {
            'bg': '#f0f0f0',
            'primary': '#6C5CE7',
            'secondary': '#A29BFE',
            'success': '#00B894',
            'warning': '#FDCB6E',
            'danger': '#E17055',
            'text': '#2D3436',
            'card_bg': '#FFFFFF',
            'hover': '#5A4BD1'
        }
        
        self._init_pose_library()
        self._init_default_sessions()
        self.load_data()
        self._setup_ui()
        
    def _init_pose_library(self):
        """初始化姿势库"""
        poses = [
            YogaPose("山式", "站立", 1, 
                    ["改善体态", "增强腿部力量", "提高专注力"],
                    ["双脚并拢站立", "脊柱向上延展", "双手自然下垂", "深呼吸5次"]),
            YogaPose("下犬式", "站立", 2,
                    ["拉伸脊柱", "强化手臂", "改善循环"],
                    ["四肢着地", "臀部向上抬起", "保持脊柱延展", "保持30秒"]),
            YogaPose("战士一式", "站立", 2,
                    ["增强腿部力量", "打开髋部", "改善平衡"],
                    ["双脚分开", "屈膝90度", "手臂向上伸展", "保持5个呼吸"]),
            YogaPose("战士二式", "站立", 2,
                    ["增强腿部力量", "打开胸廓", "提高专注力"],
                    ["双脚分开", "手臂平举", "屈膝看手指", "保持5个呼吸"]),
            YogaPose("三角式", "站立", 3,
                    ["拉伸侧身", "改善消化", "增强腿部"],
                    ["双脚分开", "手臂平举", "侧弯触摸脚踝", "保持30秒"]),
            YogaPose("简易坐", "坐姿", 1,
                    ["放松髋部", "改善消化", "平静心智"],
                    ["交叉腿坐姿", "脊柱挺直", "双手放膝盖", "深呼吸"]),
            YogaPose("蝴蝶式", "坐姿", 2,
                    ["打开髋部", "改善循环", "放松腿部"],
                    ["脚掌相对", "双手抓脚", "膝盖上下摆动", "保持1分钟"]),
            YogaPose("树式", "平衡", 3,
                    ["改善平衡", "增强腿部", "提高专注力"],
                    ["单腿站立", "另一脚放大腿内侧", "双手合十", "保持30秒"]),
            YogaPose("鹰式", "平衡", 4,
                    ["增强平衡", "打开肩部", "改善协调"],
                    ["交叉双腿", "手臂缠绕", "保持平衡", "保持30秒"]),
            YogaPose("眼镜蛇式", "后弯", 2,
                    ["打开胸腔", "强化背部", "改善呼吸"],
                    ["俯卧", "手掌撑地", "上身抬起", "保持30秒"]),
            YogaPose("桥式", "后弯", 3,
                    ["打开胸腔", "强化臀部", "拉伸脊柱"],
                    ["仰卧屈膝", "臀部抬起", "双手支撑腰部", "保持30秒"]),
            YogaPose("脊柱扭转", "扭转", 2,
                    ["改善消化", "灵活脊柱", "按摩内脏"],
                    ["坐姿屈膝", "扭转脊柱", "看肩膀方向", "保持30秒"]),
            YogaPose("婴儿式", "放松", 1,
                    ["放松背部", "平静心智", "缓解压力"],
                    ["跪坐", "前屈触地", "手臂伸展", "保持1分钟"]),
            YogaPose("仰卧放松式", "放松", 1,
                    ["全身放松", "恢复体力", "平静心智"],
                    ["仰卧", "双手放体侧", "关闭眼睛", "保持5分钟"]),
        ]
        
        for pose in poses:
            self.pose_library[pose.name] = pose
    
    def _init_default_sessions(self):
        """初始化默认课程"""
        sessions_data = [
            {
                "name": "🧘 初学者基础",
                "poses": ["山式", "简易坐", "婴儿式", "下犬式", "眼镜蛇式", "仰卧放松式"],
                "difficulty": 1,
                "duration": 15,
                "focus_area": "全身"
            },
            {
                "name": "💪 站立序列",
                "poses": ["山式", "战士一式", "战士二式", "三角式", "树式", "下犬式", "婴儿式"],
                "difficulty": 2,
                "duration": 25,
                "focus_area": "腿部"
            },
            {
                "name": "🦋 髋部打开",
                "poses": ["蝴蝶式", "简易坐", "战士一式", "桥式", "脊柱扭转", "仰卧放松式"],
                "difficulty": 2,
                "duration": 20,
                "focus_area": "髋部"
            },
            {
                "name": "⚖️ 平衡训练",
                "poses": ["树式", "鹰式", "战士二式", "三角式", "山式", "眼镜蛇式", "婴儿式"],
                "difficulty": 3,
                "duration": 25,
                "focus_area": "平衡"
            },
            {
                "name": "🌊 全面流瑜伽",
                "poses": ["山式", "下犬式", "战士一式", "战士二式", "三角式", "桥式", 
                         "脊柱扭转", "眼镜蛇式", "婴儿式", "仰卧放松式"],
                "difficulty": 3,
                "duration": 35,
                "focus_area": "全身"
            },
            {
                "name": "🌿 放松疗愈",
                "poses": ["婴儿式", "蝴蝶式", "简易坐", "脊柱扭转", "仰卧放松式"],
                "difficulty": 1,
                "duration": 20,
                "focus_area": "放松"
            }
        ]
        
        for data in sessions_data:
            poses = []
            for pose_name in data["poses"]:
                if pose_name in self.pose_library:
                    poses.append(self.pose_library[pose_name])
            
            session = YogaSession(
                name=data["name"],
                poses=poses,
                difficulty=data["difficulty"],
                duration=data["duration"],
                focus_area=data["focus_area"]
            )
            self.sessions.append(session)
    
    def _setup_ui(self):
        """设置用户界面"""
        # 主框架 - 使用PanedWindow实现可调整的分割
        self.main_paned = ttk.PanedWindow(self.root, orient=tk.HORIZONTAL)
        self.main_paned.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
        
        # 左侧面板 - 课程列表
        self.left_frame = ttk.Frame(self.main_paned)
        self.main_paned.add(self.left_frame, weight=2)
        
        # 右侧面板 - 内容显示
        self.right_frame = ttk.Frame(self.main_paned)
        self.main_paned.add(self.right_frame, weight=3)
        
        self._setup_left_panel()
        self._setup_right_panel()
        self._setup_menu()
        
    def _setup_menu(self):
        """设置菜单栏"""
        menubar = tk.Menu(self.root)
        self.root.config(menu=menubar)
        
        # 文件菜单
        file_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="文件", menu=file_menu)
        file_menu.add_command(label="保存数据", command=self.save_data)
        file_menu.add_command(label="重置进度", command=self.reset_progress)
        file_menu.add_separator()
        file_menu.add_command(label="退出", command=self.root.quit)
        
        # 工具菜单
        tools_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="工具", menu=tools_menu)
        tools_menu.add_command(label="呼吸练习", command=self.show_breathing_exercise)
        tools_menu.add_command(label="创建自定义课程", command=self.show_create_session)
        
        # 帮助菜单
        help_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="帮助", menu=help_menu)
        help_menu.add_command(label="使用说明", command=self.show_help)
        help_menu.add_command(label="关于", command=self.show_about)
        
    def _setup_left_panel(self):
        """设置左侧面板"""
        # 标题
        title_label = tk.Label(self.left_frame, text="📋 瑜伽课程", 
                              font=('微软雅黑', 16, 'bold'), 
                              fg=self.colors['primary'])
        title_label.pack(pady=(10, 5))
        
        # 搜索框
        search_frame = ttk.Frame(self.left_frame)
        search_frame.pack(fill=tk.X, padx=10, pady=5)
        
        self.search_var = tk.StringVar()
        self.search_var.trace('w', lambda *args: self.filter_sessions())
        search_entry = ttk.Entry(search_frame, textvariable=self.search_var)
        search_entry.pack(side=tk.LEFT, fill=tk.X, expand=True)
        search_entry.insert(0, "搜索课程...")
        search_entry.bind('<FocusIn>', lambda e: search_entry.delete(0, tk.END) if search_entry.get() == "搜索课程..." else None)
        
        # 课程列表
        list_frame = ttk.Frame(self.left_frame)
        list_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
        
        self.session_listbox = tk.Listbox(list_frame, font=('微软雅黑', 11),
                                         bg='white', selectbackground=self.colors['primary'],
                                         selectforeground='white', relief=tk.FLAT)
        self.session_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        
        # 滚动条
        scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL, 
                                 command=self.session_listbox.yview)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.session_listbox.config(yscrollcommand=scrollbar.set)
        
        # 填充课程列表
        self.update_session_list()
        
        # 绑定选择事件
        self.session_listbox.bind('<<ListboxSelect>>', self.on_session_select)
        
        # 按钮
        btn_frame = ttk.Frame(self.left_frame)
        btn_frame.pack(fill=tk.X, padx=10, pady=10)
        
        start_btn = tk.Button(btn_frame, text="▶ 开始练习", 
                             font=('微软雅黑', 12, 'bold'),
                             bg=self.colors['primary'], fg='white',
                             command=self.start_selected_session,
                             relief=tk.FLAT, cursor='hand2')
        start_btn.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(0, 5))
        
        custom_btn = tk.Button(btn_frame, text="➕ 自定义",
                              font=('微软雅黑', 12, 'bold'),
                              bg=self.colors['secondary'], fg='white',
                              command=self.show_create_session,
                              relief=tk.FLAT, cursor='hand2')
        custom_btn.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(5, 0))
        
    def _setup_right_panel(self):
        """设置右侧面板"""
        # 创建笔记本（标签页）
        self.notebook = ttk.Notebook(self.right_frame)
        self.notebook.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
        
        # 课程详情页
        self.detail_frame = ttk.Frame(self.notebook)
        self.notebook.add(self.detail_frame, text="📖 课程详情")
        self._setup_detail_page()
        
        # 练习页面
        self.practice_frame = ttk.Frame(self.notebook)
        self.notebook.add(self.practice_frame, text="🧘 练习")
        self._setup_practice_page()
        
        # 统计页面
        self.stats_frame = ttk.Frame(self.notebook)
        self.notebook.add(self.stats_frame, text="📊 统计")
        self._setup_stats_page()
        
        # 姿势库页面
        self.library_frame = ttk.Frame(self.notebook)
        self.notebook.add(self.library_frame, text="📚 姿势库")
        self._setup_library_page()
        
    def _setup_detail_page(self):
        """设置课程详情页"""
        # 课程名称
        self.detail_title = tk.Label(self.detail_frame, text="选择左侧课程查看详情",
                                    font=('微软雅黑', 18, 'bold'),
                                    fg=self.colors['primary'])
        self.detail_title.pack(pady=(20, 10))
        
        # 课程信息
        info_frame = ttk.Frame(self.detail_frame)
        info_frame.pack(fill=tk.X, padx=20, pady=5)
        
        self.detail_info = tk.Text(info_frame, height=4, font=('微软雅黑', 11),
                                  bg=self.colors['bg'], relief=tk.FLAT, wrap=tk.WORD)
        self.detail_info.pack(fill=tk.X)
        self.detail_info.config(state=tk.DISABLED)
        
        # 姿势列表
        pose_label = tk.Label(self.detail_frame, text="🧘 姿势列表",
                             font=('微软雅黑', 14, 'bold'))
        pose_label.pack(anchor=tk.W, padx=20, pady=(10, 5))
        
        self.detail_poses = scrolledtext.ScrolledText(self.detail_frame, 
                                                     font=('微软雅黑', 11),
                                                     height=12, wrap=tk.WORD)
        self.detail_poses.pack(fill=tk.BOTH, expand=True, padx=20, pady=5)
        self.detail_poses.config(state=tk.DISABLED)
        
    def _setup_practice_page(self):
        """设置练习页面"""
        # 练习状态
        self.practice_status = tk.Label(self.practice_frame, 
                                       text="准备开始练习", 
                                       font=('微软雅黑', 16, 'bold'),
                                       fg=self.colors['primary'])
        self.practice_status.pack(pady=(20, 10))
        
        # 当前姿势
        self.current_pose_label = tk.Label(self.practice_frame, 
                                          text="", 
                                          font=('微软雅黑', 20, 'bold'),
                                          fg=self.colors['text'])
        self.current_pose_label.pack(pady=10)
        
        # 姿势详情
        self.pose_detail_text = scrolledtext.ScrolledText(self.practice_frame,
                                                         font=('微软雅黑', 11),
                                                         height=10, wrap=tk.WORD)
        self.pose_detail_text.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
        self.pose_detail_text.config(state=tk.DISABLED)
        
        # 计时器
        self.timer_label = tk.Label(self.practice_frame, text="⏱️ 00:00",
                                   font=('微软雅黑', 24, 'bold'),
                                   fg=self.colors['danger'])
        self.timer_label.pack(pady=10)
        
        # 进度条
        self.progress_bar = ttk.Progressbar(self.practice_frame, length=300,
                                           mode='determinate')
        self.progress_bar.pack(pady=10)
        
        # 控制按钮
        btn_frame = ttk.Frame(self.practice_frame)
        btn_frame.pack(pady=10)
        
        self.next_btn = tk.Button(btn_frame, text="⏭ 下一个", 
                                 font=('微软雅黑', 12, 'bold'),
                                 bg=self.colors['success'], fg='white',
                                 command=self.next_pose,
                                 relief=tk.FLAT, cursor='hand2')
        self.next_btn.pack(side=tk.LEFT, padx=5)
        
        self.pause_btn = tk.Button(btn_frame, text="⏸ 暂停",
                                  font=('微软雅黑', 12, 'bold'),
                                  bg=self.colors['warning'], fg='white',
                                  command=self.toggle_pause,
                                  relief=tk.FLAT, cursor='hand2')
        self.pause_btn.pack(side=tk.LEFT, padx=5)
        
        self.stop_btn = tk.Button(btn_frame, text="⏹ 结束",
                                 font=('微软雅黑', 12, 'bold'),
                                 bg=self.colors['danger'], fg='white',
                                 command=self.stop_practice,
                                 relief=tk.FLAT, cursor='hand2')
        self.stop_btn.pack(side=tk.LEFT, padx=5)
        
        # 初始状态
        self.next_btn.config(state=tk.DISABLED)
        self.pause_btn.config(state=tk.DISABLED)
        self.stop_btn.config(state=tk.DISABLED)
        
    def _setup_stats_page(self):
        """设置统计页面"""
        # 统计卡片
        card_frame = ttk.Frame(self.stats_frame)
        card_frame.pack(fill=tk.X, padx=20, pady=20)
        
        # 创建4个统计卡片
        stats_data = [
            ("📝 练习次数", "0", "total_sessions"),
            ("⏱️ 总时长", "0 分钟", "total_minutes"),
            ("🔥 连续练习", "0 天", "streak_days"),
            ("🏅 成就", "0", "achievements")
        ]
        
        self.stats_vars = {}
        for i, (label, value, key) in enumerate(stats_data):
            frame = ttk.Frame(card_frame, relief=tk.RAISED, borderwidth=1)
            frame.grid(row=i//2, column=i%2, padx=10, pady=10, sticky='nsew')
            
            tk.Label(frame, text=label, font=('微软雅黑', 12),
                    fg=self.colors['text']).pack(pady=(10, 0))
            
            var = tk.StringVar(value=value)
            self.stats_vars[key] = var
            tk.Label(frame, textvariable=var, 
                    font=('微软雅黑', 20, 'bold'),
                    fg=self.colors['primary']).pack(pady=5)
            
            card_frame.columnconfigure(i%2, weight=1)
            card_frame.rowconfigure(i//2, weight=1)
        
        # 成就列表
        achievement_label = tk.Label(self.stats_frame, text="🏅 已解锁成就",
                                    font=('微软雅黑', 14, 'bold'))
        achievement_label.pack(anchor=tk.W, padx=20, pady=(10, 5))
        
        self.achievement_text = scrolledtext.ScrolledText(self.stats_frame,
                                                         font=('微软雅黑', 11),
                                                         height=6, wrap=tk.WORD)
        self.achievement_text.pack(fill=tk.BOTH, expand=True, padx=20, pady=5)
        self.achievement_text.config(state=tk.DISABLED)
        
        # 刷新按钮
        refresh_btn = tk.Button(self.stats_frame, text="🔄 刷新统计",
                               font=('微软雅黑', 11),
                               bg=self.colors['secondary'], fg='white',
                               command=self.update_stats_display,
                               relief=tk.FLAT, cursor='hand2')
        refresh_btn.pack(pady=10)
        
        # 初始更新
        self.update_stats_display()
        
    def _setup_library_page(self):
        """设置姿势库页面"""
        # 搜索框
        search_frame = ttk.Frame(self.library_frame)
        search_frame.pack(fill=tk.X, padx=20, pady=10)
        
        tk.Label(search_frame, text="🔍 搜索姿势:", 
                font=('微软雅黑', 11)).pack(side=tk.LEFT, padx=(0, 10))
        
        self.library_search_var = tk.StringVar()
        self.library_search_var.trace('w', lambda *args: self.update_library_display())
        search_entry = ttk.Entry(search_frame, textvariable=self.library_search_var,
                                width=30)
        search_entry.pack(side=tk.LEFT)
        search_entry.insert(0, "输入姿势名称...")
        search_entry.bind('<FocusIn>', lambda e: search_entry.delete(0, tk.END) if search_entry.get() == "输入姿势名称..." else None)
        
        # 姿势列表
        self.library_listbox = tk.Listbox(self.library_frame, font=('微软雅黑', 11),
                                         bg='white', selectbackground=self.colors['primary'],
                                         selectforeground='white', height=12)
        self.library_listbox.pack(fill=tk.BOTH, expand=True, padx=20, pady=5)
        self.library_listbox.bind('<<ListboxSelect>>', self.on_library_select)
        
        # 姿势详情
        self.library_detail = scrolledtext.ScrolledText(self.library_frame,
                                                       font=('微软雅黑', 11),
                                                       height=8, wrap=tk.WORD)
        self.library_detail.pack(fill=tk.BOTH, expand=True, padx=20, pady=5)
        self.library_detail.config(state=tk.DISABLED)
        
        # 初始显示
        self.update_library_display()
        
    def update_session_list(self, filter_text=""):
        """更新课程列表"""
        self.session_listbox.delete(0, tk.END)
        for session in self.sessions:
            if filter_text.lower() in session.name.lower():
                display_text = f"{session.name}  ⭐{session.difficulty}  {session.duration}min"
                self.session_listbox.insert(tk.END, display_text)
                
    def filter_sessions(self):
        """过滤课程列表"""
        filter_text = self.search_var.get()
        if filter_text == "搜索课程...":
            filter_text = ""
        self.update_session_list(filter_text)
        
    def on_session_select(self, event):
        """课程选择事件"""
        selection = self.session_listbox.curselection()
        if not selection:
            return
            
        index = selection[0]
        # 获取当前显示的课程列表
        items = self.session_listbox.get(0, tk.END)
        if index >= len(items):
            return
            
        # 找到对应的课程
        display_text = items[index]
        # 从显示文本中提取课程名称
        for session in self.sessions:
            if session.name in display_text:
                self.show_session_detail(session)
                break
                
    def show_session_detail(self, session):
        """显示课程详情"""
        self.detail_title.config(text=f"🧘 {session.name}")
        
        # 更新信息
        info_text = f"""难度: {'⭐' * session.difficulty}
预计时长: {session.duration} 分钟
重点部位: {session.focus_area}
姿势数量: {len(session.poses)}"""
        
        self.detail_info.config(state=tk.NORMAL)
        self.detail_info.delete(1.0, tk.END)
        self.detail_info.insert(1.0, info_text)
        self.detail_info.config(state=tk.DISABLED)
        
        # 更新姿势列表 - 修复f-string问题
        pose_text = ""
        for i, pose in enumerate(session.poses, 1):
            pose_text += f"{i}. {pose.name} (难度: {'⭐' * pose.difficulty})\n"
            pose_text += f"   {', '.join(pose.benefits[:2])}\n\n"
        
        self.detail_poses.config(state=tk.NORMAL)
        self.detail_poses.delete(1.0, tk.END)
        self.detail_poses.insert(1.0, pose_text)
        self.detail_poses.config(state=tk.DISABLED)
        
    def start_selected_session(self):
        """开始选中的课程"""
        selection = self.session_listbox.curselection()
        if not selection:
            messagebox.showwarning("提示", "请先选择一个课程")
            return
            
        index = selection[0]
        items = self.session_listbox.get(0, tk.END)
        if index >= len(items):
            return
            
        display_text = items[index]
        for session in self.sessions:
            if session.name in display_text:
                self.current_session = session
                self.start_practice()
                break
                
    def start_practice(self):
        """开始练习"""
        if not self.current_session:
            return
            
        if self.is_practicing:
            return
            
        self.is_practicing = True
        self.current_pose_index = 0
        self.total_poses = len(self.current_session.poses)
        self.pose_timer = 0
        self.is_paused = False
        
        # 切换到练习页面
        self.notebook.select(self.practice_frame)
        
        # 启用控制按钮
        self.next_btn.config(state=tk.NORMAL)
        self.pause_btn.config(state=tk.NORMAL)
        self.stop_btn.config(state=tk.NORMAL)
        
        # 显示第一个姿势
        self.show_current_pose()
        
        # 开始计时
        self.start_timer()
        
    def show_current_pose(self):
        """显示当前姿势"""
        if self.current_pose_index >= self.total_poses:
            self.finish_practice()
            return
            
        pose = self.current_session.poses[self.current_pose_index]
        
        # 更新标题
        self.practice_status.config(text=f"姿势 {self.current_pose_index + 1}/{self.total_poses}")
        self.current_pose_label.config(text=f"🧘 {pose.name}")
        
        # 修复f-string问题 - 使用字符串连接
        benefits_text = '\n• '.join(pose.benefits)
        instructions_text = '\n• '.join(pose.instructions)
        
        detail_text = f"""类别: {pose.category}
难度: {'⭐' * pose.difficulty}
保持时间: {pose.duration} 秒

✨ 益处:
• {benefits_text}

📝 步骤:
• {instructions_text}"""
        
        self.pose_detail_text.config(state=tk.NORMAL)
        self.pose_detail_text.delete(1.0, tk.END)
        self.pose_detail_text.insert(1.0, detail_text)
        self.pose_detail_text.config(state=tk.DISABLED)
        
        # 重置计时器
        self.pose_timer = 0
        self.progress_bar['maximum'] = pose.duration
        self.progress_bar['value'] = 0
        self.update_timer_display()
        
        # 开始倒计时
        self.start_countdown()
        
    def start_countdown(self):
        """开始倒计时"""
        if not self.is_practicing or self.is_paused:
            return
            
        pose = self.current_session.poses[self.current_pose_index]
        if self.pose_timer < pose.duration:
            self.pose_timer += 1
            self.progress_bar['value'] = self.pose_timer
            self.update_timer_display()
            self.root.after(1000, self.start_countdown)
        else:
            # 当前姿势完成
            self.practice_status.config(text=f"✅ {pose.name} 完成!")
            
    def update_timer_display(self):
        """更新计时器显示"""
        pose = self.current_session.poses[self.current_pose_index]
        remaining = max(0, pose.duration - self.pose_timer)
        minutes = remaining // 60
        seconds = remaining % 60
        self.timer_label.config(text=f"⏱️ {minutes:02d}:{seconds:02d}")
        
    def start_timer(self):
        """启动总计时器"""
        self.timer_running = True
        self.total_elapsed = 0
        self.update_total_timer()
        
    def update_total_timer(self):
        """更新总计时器"""
        if self.timer_running and not self.is_paused:
            self.total_elapsed += 1
            minutes = self.total_elapsed // 60
            seconds = self.total_elapsed % 60
            # 在状态栏显示总时间
            self.root.title(f"🧘 瑜伽练习 - {minutes:02d}:{seconds:02d}")
            self.root.after(1000, self.update_total_timer)
            
    def next_pose(self):
        """下一个姿势"""
        self.current_pose_index += 1
        if self.current_pose_index < self.total_poses:
            self.show_current_pose()
        else:
            self.finish_practice()
            
    def toggle_pause(self):
        """暂停/继续"""
        self.is_paused = not self.is_paused
        if self.is_paused:
            self.pause_btn.config(text="▶ 继续", bg=self.colors['success'])
            self.practice_status.config(text="⏸ 已暂停")
            self.timer_running = False
        else:
            self.pause_btn.config(text="⏸ 暂停", bg=self.colors['warning'])
            self.practice_status.config(text="练习中...")
            self.timer_running = True
            self.start_countdown()
            self.update_total_timer()
            
    def stop_practice(self):
        """停止练习"""
        if messagebox.askyesno("确认", "确定要结束练习吗？"):
            self.is_practicing = False
            self.timer_running = False
            self.is_paused = False
            
            # 重置按钮
            self.next_btn.config(state=tk.DISABLED)
            self.pause_btn.config(state=tk.DISABLED)
            self.stop_btn.config(state=tk.DISABLED)
            
            # 重置显示
            self.practice_status.config(text="练习已结束")
            self.current_pose_label.config(text="")
            self.timer_label.config(text="⏱️ 00:00")
            self.progress_bar['value'] = 0
            
            # 记录进度
            if self.total_elapsed > 0:
                minutes = self.total_elapsed // 60
                if minutes > 0:
                    self.progress.add_session(
                        self.current_session.name,
                        minutes,
                        self.current_session.difficulty
                    )
                    self.save_data()
                    self.update_stats_display()
                    messagebox.showinfo("完成", f"🎉 练习完成!\n时长: {minutes} 分钟")
                    
            self.root.title("🧘 瑜伽学习软件")
            
    def finish_practice(self):
        """完成练习"""
        self.is_practicing = False
        self.timer_running = False
        
        # 记录进度
        minutes = self.total_elapsed // 60
        if minutes > 0:
            self.progress.add_session(
                self.current_session.name,
                minutes,
                self.current_session.difficulty
            )
            self.save_data()
            self.update_stats_display()
            
        self.practice_status.config(text="🎉 课程完成!")
        self.current_pose_label.config(text="恭喜完成全部姿势!")
        self.timer_label.config(text="⏱️ 00:00")
        self.progress_bar['value'] = 0
        
        self.next_btn.config(state=tk.DISABLED)
        self.pause_btn.config(state=tk.DISABLED)
        self.stop_btn.config(state=tk.DISABLED)
        
        self.root.title("🧘 瑜伽学习软件")
        messagebox.showinfo("完成", f"🎉 课程完成!\n总时长: {minutes} 分钟")
        
    def update_stats_display(self):
        """更新统计显示"""
        stats = self.progress.get_stats()
        self.stats_vars['total_sessions'].set(str(stats['total_sessions']))
        self.stats_vars['total_minutes'].set(f"{stats['total_minutes']} 分钟")
        self.stats_vars['streak_days'].set(f"{stats['streak_days']} 天")
        self.stats_vars['achievements'].set(str(len(stats['achievements'])))
        
        # 更新成就列表
        self.achievement_text.config(state=tk.NORMAL)
        self.achievement_text.delete(1.0, tk.END)
        if stats['achievements']:
            for achievement in stats['achievements']:
                self.achievement_text.insert(tk.END, f"• {achievement}\n")
        else:
            self.achievement_text.insert(tk.END, "继续练习解锁成就吧! 💪\n")
        self.achievement_text.config(state=tk.DISABLED)
        
    def update_library_display(self):
        """更新姿势库显示"""
        self.library_listbox.delete(0, tk.END)
        search_text = self.library_search_var.get().lower()
        
        for pose_name, pose in self.pose_library.items():
            if search_text in pose_name.lower() or search_text in pose.category.lower():
                display_text = f"{pose_name}  {'⭐' * pose.difficulty}  [{pose.category}]"
                self.library_listbox.insert(tk.END, display_text)
                
    def on_library_select(self, event):
        """姿势库选择事件"""
        selection = self.library_listbox.curselection()
        if not selection:
            return
            
        index = selection[0]
        items = self.library_listbox.get(0, tk.END)
        if index >= len(items):
            return
            
        # 提取姿势名称
        display_text = items[index]
        pose_name = display_text.split('  ')[0]
        
        if pose_name in self.pose_library:
            pose = self.pose_library[pose_name]
            
            # 修复f-string问题
            benefits_text = '\n• '.join(pose.benefits)
            instructions_text = '\n• '.join(pose.instructions)
            
            detail_text = f"""🧘 {pose.name}
类别: {pose.category}
难度: {'⭐' * pose.difficulty}
保持时间: {pose.duration} 秒

✨ 益处:
• {benefits_text}

📝 步骤:
• {instructions_text}"""
            
            self.library_detail.config(state=tk.NORMAL)
            self.library_detail.delete(1.0, tk.END)
            self.library_detail.insert(1.0, detail_text)
            self.library_detail.config(state=tk.DISABLED)
            
    def show_breathing_exercise(self):
        """显示呼吸练习窗口"""
        breathing_window = tk.Toplevel(self.root)
        breathing_window.title("🌬️ 呼吸练习")
        breathing_window.geometry("500x600")
        breathing_window.resizable(False, False)
        
        # 标题
        title = tk.Label(breathing_window, text="🌬️ 4-7-8 呼吸法", 
                        font=('微软雅黑', 20, 'bold'),
                        fg=self.colors['primary'])
        title.pack(pady=20)
        
        # 说明
        instructions = tk.Label(breathing_window, 
                               text="1. 用鼻子吸气 4 秒\n2. 屏住呼吸 7 秒\n3. 用嘴呼气 8 秒",
                               font=('微软雅黑', 14),
                               justify=tk.LEFT)
        instructions.pack(pady=10)
        
        # 状态显示
        status_label = tk.Label(breathing_window, text="准备开始", 
                               font=('微软雅黑', 16, 'bold'),
                               fg=self.colors['text'])
        status_label.pack(pady=20)
        
        # 大圆显示
        canvas = tk.Canvas(breathing_window, width=300, height=300,
                          bg='white', highlightthickness=0)
        canvas.pack(pady=10)
        
        # 圆
        circle = canvas.create_oval(50, 50, 250, 250, 
                                   fill=self.colors['secondary'], 
                                   outline='', width=0)
        
        # 进度文本
        progress_text = canvas.create_text(150, 150, text="",
                                          font=('微软雅黑', 24, 'bold'),
                                          fill='white')
        
        # 进度条
        progress = ttk.Progressbar(breathing_window, length=400, 
                                  mode='determinate')
        progress.pack(pady=20)
        
        # 控制按钮
        btn_frame = ttk.Frame(breathing_window)
        btn_frame.pack(pady=10)
        
        is_running = [False]
        
        def breathing_cycle():
            """呼吸循环"""
            if not is_running[0]:
                return
                
            phases = [
                ("吸气...", 4, self.colors['success']),
                ("屏息...", 7, self.colors['warning']),
                ("呼气...", 8, self.colors['danger'])
            ]
            
            total_steps = sum(phase[1] for phase in phases)
            current_step = 0
            
            def phase_step(phase_idx, step_count):
                if not is_running[0]:
                    return
                    
                if phase_idx >= len(phases):
                    # 完成一轮
                    status_label.config(text="✅ 完成一轮")
                    canvas.itemconfig(circle, fill=self.colors['secondary'])
                    canvas.itemconfig(progress_text, text="")
                    progress['value'] = 0
                    breathing_window.after(1000, breathing_cycle)
                    return
                    
                phase_name, duration, color = phases[phase_idx]
                if step_count <= duration:
                    # 更新显示
                    status_label.config(text=phase_name)
                    canvas.itemconfig(circle, fill=color)
                    canvas.itemconfig(progress_text, text=str(step_count))
                    
                    # 更新进度
                    current_step = sum(phases[i][1] for i in range(phase_idx)) + step_count
                    progress['value'] = (current_step / total_steps) * 100
                    
                    # 下一步
                    breathing_window.after(1000, lambda: phase_step(phase_idx, step_count + 1))
                else:
                    # 下一阶段
                    phase_step(phase_idx + 1, 1)
                    
            # 开始第一轮
            phase_step(0, 1)
            
        def start_breathing():
            """开始呼吸练习"""
            if is_running[0]:
                return
            is_running[0] = True
            start_btn.config(text="⏹ 停止", bg=self.colors['danger'])
            status_label.config(text="开始练习...")
            breathing_cycle()
            
        def stop_breathing():
            """停止呼吸练习"""
            is_running[0] = False
            start_btn.config(text="▶ 开始", bg=self.colors['success'])
            status_label.config(text="已停止")
            canvas.itemconfig(circle, fill=self.colors['secondary'])
            canvas.itemconfig(progress_text, text="")
            progress['value'] = 0
            
        start_btn = tk.Button(btn_frame, text="▶ 开始", 
                             font=('微软雅黑', 12, 'bold'),
                             bg=self.colors['success'], fg='white',
                             command=start_breathing,
                             relief=tk.FLAT, cursor='hand2')
        start_btn.pack(side=tk.LEFT, padx=5)
        
        stop_btn = tk.Button(btn_frame, text="⏹ 停止",
                            font=('微软雅黑', 12, 'bold'),
                            bg=self.colors['danger'], fg='white',
                            command=stop_breathing,
                            relief=tk.FLAT, cursor='hand2')
        stop_btn.pack(side=tk.LEFT, padx=5)
        
        # 关闭窗口时停止
        def on_close():
            is_running[0] = False
            breathing_window.destroy()
            
        breathing_window.protocol("WM_DELETE_WINDOW", on_close)
        
    def show_create_session(self):
        """显示创建自定义课程窗口"""
        create_window = tk.Toplevel(self.root)
        create_window.title("📝 创建自定义课程")
        create_window.geometry("600x600")
        
        # 课程名称
        tk.Label(create_window, text="课程名称:", font=('微软雅黑', 12)).pack(pady=(20, 5))
        name_entry = ttk.Entry(create_window, font=('微软雅黑', 11), width=40)
        name_entry.pack(pady=5)
        
        # 选择姿势
        tk.Label(create_window, text="选择姿势 (按住Ctrl多选):", 
                font=('微软雅黑', 12)).pack(pady=(20, 5))
        
        list_frame = ttk.Frame(create_window)
        list_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=5)
        
        pose_listbox = tk.Listbox(list_frame, font=('微软雅黑', 11),
                                 selectmode=tk.MULTIPLE,
                                 bg='white', height=12)
        pose_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        
        scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL,
                                 command=pose_listbox.yview)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        pose_listbox.config(yscrollcommand=scrollbar.set)
        
        # 填充姿势列表
        for pose_name in self.pose_library.keys():
            pose_listbox.insert(tk.END, pose_name)
            
        # 选中的姿势显示
        tk.Label(create_window, text="已选姿势:", font=('微软雅黑', 12)).pack(pady=(20, 5))
        selected_text = scrolledtext.ScrolledText(create_window, height=4,
                                                 font=('微软雅黑', 11), wrap=tk.WORD)
        selected_text.pack(fill=tk.X, padx=20, pady=5)
        selected_text.config(state=tk.DISABLED)
        
        def update_selected():
            """更新已选姿势显示"""
            selected = pose_listbox.curselection()
            selected_text.config(state=tk.NORMAL)
            selected_text.delete(1.0, tk.END)
            for idx in selected:
                pose_name = pose_listbox.get(idx)
                selected_text.insert(tk.END, f"• {pose_name}\n")
            selected_text.config(state=tk.DISABLED)
            
        pose_listbox.bind('<<ListboxSelect>>', lambda e: update_selected())
        
        def create_session():
            """创建课程"""
            name = name_entry.get().strip()
            if not name:
                messagebox.showwarning("提示", "请输入课程名称")
                return
                
            selected = pose_listbox.curselection()
            if not selected:
                messagebox.showwarning("提示", "请选择至少一个姿势")
                return
                
            poses = []
            for idx in selected:
                pose_name = pose_listbox.get(idx)
                if pose_name in self.pose_library:
                    poses.append(self.pose_library[pose_name])
                    
            if poses:
                total_duration = sum(pose.duration for pose in poses) // 60
                session = YogaSession(
                    name=f"📝 {name}",
                    poses=poses,
                    difficulty=2,
                    duration=total_duration,
                    focus_area="自定义"
                )
                self.sessions.append(session)
                self.update_session_list()
                messagebox.showinfo("成功", f"✅ 自定义课程 '{name}' 已创建!\n包含 {len(poses)} 个姿势")
                create_window.destroy()
                
        # 创建按钮
        btn_frame = ttk.Frame(create_window)
        btn_frame.pack(pady=20)
        
        create_btn = tk.Button(btn_frame, text="✅ 创建课程",
                              font=('微软雅黑', 12, 'bold'),
                              bg=self.colors['success'], fg='white',
                              command=create_session,
                              relief=tk.FLAT, cursor='hand2')
        create_btn.pack(side=tk.LEFT, padx=5)
        
        cancel_btn = tk.Button(btn_frame, text="取消",
                              font=('微软雅黑', 12, 'bold'),
                              bg=self.colors['danger'], fg='white',
                              command=create_window.destroy,
                              relief=tk.FLAT, cursor='hand2')
        cancel_btn.pack(side=tk.LEFT, padx=5)
        
    def save_data(self):
        """保存数据"""
        data = {
            "progress": {
                "sessions_completed": self.progress.sessions_completed,
                "total_minutes": self.progress.total_minutes,
                "total_sessions": self.progress.total_sessions,
                "streak_days": self.progress.streak_days,
                "last_practice_date": self.progress.last_practice_date,
                "achievements": self.progress.achievements
            }
        }
        try:
            with open(self.data_file, 'w', encoding='utf-8') as f:
                json.dump(data, f, ensure_ascii=False, indent=2)
            messagebox.showinfo("成功", "数据已保存")
        except Exception as e:
            messagebox.showerror("错误", f"保存失败: {e}")
            
    def load_data(self):
        """加载数据"""
        if os.path.exists(self.data_file):
            try:
                with open(self.data_file, 'r', encoding='utf-8') as f:
                    data = json.load(f)
                    progress_data = data.get("progress", {})
                    self.progress.sessions_completed = progress_data.get("sessions_completed", [])
                    self.progress.total_minutes = progress_data.get("total_minutes", 0)
                    self.progress.total_sessions = progress_data.get("total_sessions", 0)
                    self.progress.streak_days = progress_data.get("streak_days", 0)
                    self.progress.last_practice_date = progress_data.get("last_practice_date")
                    self.progress.achievements = progress_data.get("achievements", [])
            except Exception as e:
                print(f"加载数据失败: {e}")
                
    def reset_progress(self):
        """重置进度"""
        if messagebox.askyesno("确认", "确定要重置所有学习进度吗？"):
            self.progress = YogaProgress()
            self.save_data()
            self.update_stats_display()
            messagebox.showinfo("成功", "进度已重置")
            
    def show_help(self):
        """显示帮助"""
        help_text = """🧘 瑜伽学习软件 - 使用说明

1. 📋 课程列表
   - 从左侧选择瑜伽课程
   - 使用搜索框快速查找课程
   - 点击"开始练习"进入练习模式

2. 🧘 练习模式
   - 跟随指导完成每个姿势
   - 计时器会提示保持时间
   - 使用"下一个"切换到下个姿势
   - 可暂停/继续练习

3. 📊 统计
   - 查看练习次数和总时长
   - 追踪连续练习天数
   - 解锁成就获得奖励

4. 📚 姿势库
   - 浏览所有瑜伽姿势
   - 查看姿势详解和益处
   - 搜索特定姿势

5. 🌬️ 呼吸练习
   - 4-7-8呼吸法
   - 可视化引导
   - 帮助放松身心

6. ✨ 自定义课程
   - 选择喜欢的姿势
   - 创建个性化课程
   - 随时添加新课程

祝您练习愉快！🧘"""
        
        messagebox.showinfo("使用说明", help_text)
        
    def show_about(self):
        """显示关于"""
        about_text = """🧘 瑜伽学习软件 v2.0

一款功能完整的瑜伽学习桌面应用

功能特点:
• 丰富的瑜伽姿势库
• 预设课程和自定义课程
• 练习计时和进度追踪
• 成就系统
• 呼吸练习

技术栈: Python + Tkinter

祝您身心健康！🌟"""
        
        messagebox.showinfo("关于", about_text)

def main():
    """主函数"""
    root = tk.Tk()
    app = YogaAppGUI(root)
    
    # 设置窗口图标（如果有的话）
    try:
        root.iconbitmap(default='yoga.ico')
    except:
        pass
        
    root.mainloop()

if __name__ == "__main__":
    main()