import pygame
import time

# 初始化Pygame
pygame.init()
WIDTH, HEIGHT = 1020, 680
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("瑜伽自学助手 | 零基础入门练习软件")
clock = pygame.time.Clock()
FPS = 60

# 柔和护眼配色
BG_MAIN = (245, 248, 250)
BG_CARD = (255, 255, 255)
TEXT_DARK = (30, 35, 45)
TEXT_LIGHT = (90, 95, 110)
THEME_GREEN = (76, 175, 135)
THEME_LIGHT = (160, 220, 190)
WARN_RED = (220, 80, 80)
BORDER_GRAY = (210, 215, 220)
BTN_HOVER = (55, 155, 115)

# 字体兼容兜底
try:
    font_title = pygame.font.Font("simhei.ttf", 32)
    font_sub = pygame.font.Font("simhei.ttf", 24)
    font_text = pygame.font.Font("simhei.ttf", 18)
    font_tiny = pygame.font.Font("simhei.ttf", 15)
except:
    font_title = pygame.font.SysFont("Microsoft YaHei", 32)
    font_sub = pygame.font.SysFont("Microsoft YaHei", 24)
    font_text = pygame.font.SysFont("Microsoft YaHei", 18)
    font_tiny = pygame.font.SysFont("Microsoft YaHei", 15)

# 页面状态枚举
PAGE_MAIN = 0
PAGE_CATEGORY = 1
PAGE_POSE_DETAIL = 2
current_page = PAGE_MAIN

# 全局选中数据
select_category = ""
select_pose_idx = -1
favorite_list = set()  # 收藏体式索引
practice_record = {}   # {体式名:练习次数}

# 瑜伽体式数据库
yoga_data = {
    "放松舒缓": [
        {
            "name": "婴儿式",
            "steps": ["1.跪姿准备，双膝可分开与髋同宽，脚背贴垫",
                      "2.呼气身体向前折叠，额头轻触瑜伽垫",
                      "3.手臂向前伸直，腰背完全放松下沉",
                      "4.保持5~10次缓慢深呼吸"],
            "benefit": "放松腰背、缓解腰背酸痛，高强度练习后快速恢复体力",
            "warning": "膝盖不适可垫毛巾在膝下",
            "default_time": 60
        },
        {
            "name": "仰卧束角式",
            "steps": ["1.平躺垫面，双脚脚心相对，膝盖自然向两侧打开",
                      "2.双手轻放大腿，脊柱贴地放松",
                      "3.全程缓慢腹式呼吸"],
            "benefit": "打开髋部、舒缓盆腔压力，睡前练习助眠",
            "warning": "腰椎突出者腰部下方垫薄枕",
            "default_time": 90
        },
        {
            "name": "平躺尸式",
            "steps": ["1.全身平躺，四肢自然摊开，手掌朝上",
                      "2.从头到脚逐部位放松肌肉，放空思绪"],
            "benefit": "深度身心放松，平复焦虑、舒缓神经",
            "warning": "颈椎不适头部垫高一点",
            "default_time": 120
        }
    ],
    "柔韧拉伸": [
        {
            "name": "下犬式",
            "steps": ["1.四足跪姿，双手在肩正下方，膝盖髋部对齐",
                      "2.呼气抬臀向后上方推送，身体呈倒V",
                      "3.手臂推地延展肩背，脚跟尽量踩向地面",
                      "4.保持5组呼吸"],
            "benefit": "拉伸小腿后侧、延展脊柱、灵活肩颈",
            "warning": "高血压人群头部不要过低，微屈膝",
            "default_time": 45
        },
        {
            "name": "猫牛式",
            "steps": ["1.四足跪姿，手腕肩对齐，膝盖髋对齐",
                      "2.吸气塌腰翘臀抬头（牛式）",
                      "3.呼气拱背收腹低头看肚脐（猫式）",
                      "4.连贯重复8~10轮"],
            "benefit": "活动整条脊柱，缓解久坐僵硬腰酸",
            "warning": "手腕疼可握拳撑地",
            "default_time": 60
        },
        {
            "name": "坐姿前屈",
            "steps": ["1.坐姿双腿伸直，腰背挺直",
                      "2.从髋部折叠身体向前，手抓脚掌/小腿",
                      "3.不要弓背强行下压，循序渐进拉伸"],
            "benefit": "拉伸大腿后侧腘绳肌，放松后背",
            "warning": "腰背僵硬不要猛压，避免拉伤",
            "default_time": 50
        }
    ],
    "力量塑形": [
        {
            "name": "平板支撑",
            "steps": ["1.俯卧，前臂/手掌撑地，身体一条直线",
                      "2.收紧核心臀部，不要塌腰翘臀",
                      "3.均匀呼吸不憋气"],
            "benefit": "强化核心、手臂、腰腹整体力量",
            "warning": "腰椎不适立刻停止，新手可膝盖着地",
            "default_time": 30
        },
        {
            "name": "上犬式",
            "steps": ["1.俯卧垫面，双手放胸腔两侧",
                      "2.吸气发力推起上半身，脚背贴地",
                      "3.胸腔向前打开，肩膀远离耳朵"],
            "benefit": "打开胸腔改善含胸驼背，拉伸腹前侧",
            "warning": "不要过度挤压腰椎，力度轻柔",
            "default_time": 35
        },
        {
            "name": "桥式",
            "steps": ["1.仰卧屈膝，双脚踩地与髋同宽",
                      "2.吸气臀部向上抬起，肩背贴地",
                      "3.可双手体后相扣加深延展"],
            "benefit": "提臀塑形、打开胸腔、舒缓腰背",
            "warning": "颈部不要发力，全程放松脖颈",
            "default_time": 40
        }
    ],
    "平衡入门": [
        {
            "name": "树式",
            "steps": ["1.山式站立，重心落在左脚脚掌",
                      "2.右脚脚掌贴左腿内侧（脚踝/小腿/大腿）",
                      "3.双手合十放胸前或举过头顶",
                      "4.凝视前方固定点保持平衡"],
            "benefit": "锻炼脚踝稳定性，提升专注力与身体控制",
            "warning": "膝盖不要外顶，不要放在膝关节处",
            "default_time": 35
        },
        {
            "name": "战士二式",
            "steps": ["1.双脚大步分开，右脚外旋90度，左脚微内扣",
                      "2.右膝弯曲对齐脚踝，骨盆摆正",
                      "3.双臂平举与肩同高，视线看右手指尖"],
            "benefit": "强化腿部力量，打开髋部与胸腔",
            "warning": "前膝不要超过脚尖，保护膝关节",
            "default_time": 45
        },
        {
            "name": "单腿前屈式",
            "steps": ["1.单腿站立，另一条腿向后抬起",
                      "2.上半身向前平行地面，背部平直",
                      "3.核心收紧稳住身体"],
            "benefit": "单侧拉伸后侧链，强化单侧核心",
            "warning": "新手可以手扶墙面练习",
            "default_time": 30
        }
    ]
}
category_list = list(yoga_data.keys())

# 计时器变量
timer_total = 0
timer_left = 0
timer_running = False
timer_start_tick = 0
breath_circle_r = 40
breath_dir = 1  # 1放大吸气 -1缩小呼气

# 按钮矩形缓存
btn_back = pygame.Rect(20, 20, 100, 42)
category_btns = []
pose_btns = []
btn_start_timer = pygame.Rect(720, 140, 130, 45)
btn_reset_timer = pygame.Rect(720, 200, 130, 45)
btn_fav = pygame.Rect(720, 260, 130, 45)

# 绘制圆角矩形工具
def draw_round_rect(surface, rect, color, radius=12, border=0, b_color=(0,0,0)):
    x,y,w,h = rect
    if border > 0:
        pygame.draw.rect(surface, b_color, rect, border, radius)
    pygame.draw.rect(surface, color, rect, 0, radius)

# 主菜单页面
def draw_main_page(mouse_pos):
    screen.fill(BG_MAIN)
    # 标题
    title = font_title.render("瑜伽自学助手", True, TEXT_DARK)
    screen.blit(title, (WIDTH//2 - title.get_width()//2, 80))
    sub_title = font_sub.render("选择练习分类开始自学", True, TEXT_LIGHT)
    screen.blit(sub_title, (WIDTH//2 - sub_title.get_width()//2, 130))

    # 四大分类按钮
    global category_btns
    category_btns.clear()
    start_y = 200
    gap_y = 95
    for idx, cat in enumerate(category_list):
        btn = pygame.Rect(260, start_y + idx*gap_y, 500, 72)
        category_btns.append((btn, cat))
        hover = btn.collidepoint(mouse_pos)
        col = THEME_GREEN if hover else BG_CARD
        draw_round_rect(screen, btn, col, 14, 2, BORDER_GRAY)
        txt = font_sub.render(cat, True, TEXT_DARK)
        screen.blit(txt, (btn.centerx - txt.get_width()//2, btn.centery - txt.get_height()//2))

    # 底部提示
    tip = font_tiny.render(f"已收藏体式：{len(favorite_list)} | 累计练习体式：{len(practice_record)}", True, TEXT_LIGHT)
    screen.blit(tip, (WIDTH//2 - tip.get_width()//2, HEIGHT-60))

# 分类列表页
def draw_category_page(mouse_pos):
    screen.fill(BG_MAIN)
    draw_round_rect(screen, btn_back, BG_CARD, 10, 2, BORDER_GRAY)
    back_txt = font_text.render("← 返回", True, TEXT_DARK)
    screen.blit(back_txt, (btn_back.centerx - back_txt.get_width()//2, btn_back.centery - back_txt.get_height()//2))

    head = font_sub.render(f"【{select_category}】体式列表", True, TEXT_DARK)
    screen.blit(head, (140, 25))

    pose_list = yoga_data[select_category]
    global pose_btns
    pose_btns.clear()
    start_y = 90
    gap_y = 78
    for idx, pose in enumerate(pose_list):
        btn = pygame.Rect(40, start_y + idx*gap_y, 940, 68)
        pose_btns.append((btn, idx))
        hover = btn.collidepoint(mouse_pos)
        col = THEME_LIGHT if hover else BG_CARD
        draw_round_rect(screen, btn, col, 12, 2, BORDER_GRAY)
        name_txt = font_text.render(f"{idx+1}. {pose['name']}", True, TEXT_DARK)
        screen.blit(name_txt, (btn.x+25, btn.y+18))
        # 标记收藏
        if (select_category, idx) in favorite_list:
            fav_mark = font_tiny.render("★已收藏", True, THEME_GREEN)
            screen.blit(fav_mark, (btn.right - 110, btn.y+22))
        # 练习次数
        cnt = practice_record.get(pose["name"], 0)
        cnt_txt = font_tiny.render(f"练习{cnt}次", True, TEXT_LIGHT)
        screen.blit(cnt_txt, (btn.right - 220, btn.y+22))

# 体式详情页面
def draw_detail_page(mouse_pos):
    global breath_circle_r, breath_dir, timer_left, timer_running
    screen.fill(BG_MAIN)
    draw_round_rect(screen, btn_back, BG_CARD, 10, 2, BORDER_GRAY)
    back_txt = font_text.render("← 返回列表", True, TEXT_DARK)
    screen.blit(back_txt, (btn_back.centerx - back_txt.get_width()//2, btn_back.centery - back_txt.get_height()//2))

    pose = yoga_data[select_category][select_pose_idx]
    pose_key = (select_category, select_pose_idx)

    # 标题
    name_title = font_title.render(pose["name"], True, THEME_GREEN)
    screen.blit(name_title, (40, 20))

    # 右侧计时面板
    # 启动计时按钮
    hover_start = btn_start_timer.collidepoint(mouse_pos)
    draw_round_rect(screen, btn_start_timer, BTN_HOVER if hover_start else THEME_GREEN, 10)
    s_txt = font_text.render("开始计时", True, (255,255,255))
    screen.blit(s_txt, (btn_start_timer.centerx - s_txt.get_width()//2, btn_start_timer.centery - s_txt.get_height()//2))

    # 重置计时
    hover_reset = btn_reset_timer.collidepoint(mouse_pos)
    draw_round_rect(screen, btn_reset_timer, BTN_HOVER if hover_reset else THEME_GREEN, 10)
    r_txt = font_text.render("重置计时", True, (255,255,255))
    screen.blit(r_txt, (btn_reset_timer.centerx - r_txt.get_width()//2, btn_reset_timer.centery - r_txt.get_height()//2))

    # 收藏按钮
    hover_fav = btn_fav.collidepoint(mouse_pos)
    fav_color = THEME_GREEN if pose_key in favorite_list else (180,180,180)
    draw_round_rect(screen, btn_fav, fav_color if not hover_fav else BTN_HOVER, 10)
    f_txt = font_text.render("取消收藏" if pose_key in favorite_list else "加入收藏", True, (255,255,255))
    screen.blit(f_txt, (btn_fav.centerx - f_txt.get_width()//2, btn_fav.centery - f_txt.get_height()//2))

    # 倒计时数字
    time_str = f"{timer_left//60:02d}:{timer_left%60:02d}"
    time_render = font_title.render(time_str, True, TEXT_DARK)
    screen.blit(time_render, (740, 60))

    # 呼吸引导动画圆
    breath_cx, breath_cy = 850, 520
    if timer_running:
        breath_circle_r += breath_dir * 0.7
        if breath_circle_r > 75:
            breath_dir = -1
        elif breath_circle_r < 30:
            breath_dir = 1
    pygame.draw.circle(screen, THEME_LIGHT, (breath_cx, breath_cy), int(breath_circle_r), 3)
    breath_tip = font_tiny.render("吸气↑放大 | 呼气↓缩小", True, TEXT_LIGHT)
    screen.blit(breath_tip, (breath_cx - breath_tip.get_width()//2, breath_cy + 90))

    # 步骤区域卡片
    step_card = pygame.Rect(35, 90, 650, 320)
    draw_round_rect(screen, step_card, BG_CARD, 14, 2, BORDER_GRAY)
    step_head = font_sub.render("练习步骤", True, TEXT_DARK)
    screen.blit(step_head, (step_card.x+22, step_card.y+15))
    y_off = 55
    for line in pose["steps"]:
        line_r = font_text.render(line, True, TEXT_DARK)
        screen.blit(line_r, (step_card.x+22, step_card.y + y_off))
        y_off += 42

    # 益处卡片
    bene_card = pygame.Rect(35, 430, 650, 95)
    draw_round_rect(screen, bene_card, BG_CARD, 14, 2, BORDER_GRAY)
    bene_h = font_sub.render("练习益处", True, THEME_GREEN)
    screen.blit(bene_h, (bene_card.x+22, bene_card.y+12))
    bene_txt = font_text.render(pose["benefit"], True, TEXT_DARK)
    screen.blit(bene_txt, (bene_card.x+22, bene_card.y+48))

    # 禁忌提示
    warn_card = pygame.Rect(35, 540, 650, 85)
    draw_round_rect(screen, warn_card, BG_CARD, 14, 2, BORDER_GRAY)
    warn_h = font_sub.render("注意禁忌", True, WARN_RED)
    screen.blit(warn_h, (warn_card.x+22, warn_card.y+12))
    warn_txt = font_text.render(pose["warning"], True, TEXT_DARK)
    screen.blit(warn_txt, (warn_card.x+22, warn_card.y+45))

# 主循环
running = True
while running:
    mouse_pos = pygame.mouse.get_pos()
    clock.tick(FPS)

    # 计时倒计时逻辑
    if timer_running:
        current_tick = pygame.time.get_ticks()
        if current_tick - timer_start_tick >= 1000:
            timer_start_tick = current_tick
            timer_left -= 1
            if timer_left <= 0:
                timer_running = False

    # 页面渲染分发
    if current_page == PAGE_MAIN:
        draw_main_page(mouse_pos)
    elif current_page == PAGE_CATEGORY:
        draw_category_page(mouse_pos)
    elif current_page == PAGE_POSE_DETAIL:
        draw_detail_page(mouse_pos)

    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            # 返回按钮通用
            if btn_back.collidepoint(mouse_pos):
                if current_page == PAGE_POSE_DETAIL:
                    current_page = PAGE_CATEGORY
                    timer_running = False
                elif current_page == PAGE_CATEGORY:
                    current_page = PAGE_MAIN

            # 主页点击分类进入列表
            if current_page == PAGE_MAIN:
                for btn, cat in category_btns:
                    if btn.collidepoint(mouse_pos):
                        select_category = cat
                        current_page = PAGE_CATEGORY

            # 列表点击体式进入详情
            if current_page == PAGE_CATEGORY:
                for btn, idx in pose_btns:
                    if btn.collidepoint(mouse_pos):
                        select_pose_idx = idx
                        pose_info = yoga_data[select_category][idx]
                        timer_total = pose_info["default_time"]
                        timer_left = timer_total
                        timer_running = False
                        breath_circle_r = 40
                        breath_dir = 1
                        current_page = PAGE_POSE_DETAIL

            # 详情页按钮
            if current_page == PAGE_POSE_DETAIL:
                pose_key = (select_category, select_pose_idx)
                pose_name = yoga_data[select_category][select_pose_idx]["name"]
                # 开始计时
                if btn_start_timer.collidepoint(mouse_pos):
                    if not timer_running and timer_left > 0:
                        timer_running = True
                        timer_start_tick = pygame.time.get_ticks()
                        # 记录练习次数
                        practice_record[pose_name] = practice_record.get(pose_name, 0) + 1
                # 重置计时
                if btn_reset_timer.collidepoint(mouse_pos):
                    timer_running = False
                    timer_left = timer_total
                    breath_circle_r = 40
                # 收藏切换
                if btn_fav.collidepoint(mouse_pos):
                    if pose_key in favorite_list:
                        favorite_list.remove(pose_key)
                    else:
                        favorite_list.add(pose_key)

    pygame.display.update()

pygame.quit()