-- 普拉提训练系统完整表结构创建脚本
-- 执行前请确保删除旧表（注意删除顺序，避免外键约束错误）

-- 禁用外键检查（创建时）
SET FOREIGN_KEY_CHECKS = 0;

-- 删除现有表（如果存在）
DROP TABLE IF EXISTS `t_schedule_exercises`;
DROP TABLE IF EXISTS `t_training_plans`;
DROP TABLE IF EXISTS `t_exercises`;
DROP TABLE IF EXISTS `t_exercise_categories`;

-- 重新启用外键检查
SET FOREIGN_KEY_CHECKS = 1;

-- 创建分类表
CREATE TABLE `t_exercise_categories` (
  `key` varchar(255) NOT NULL COMMENT '分类唯一键（英文/下划线）',
  `name` varchar(255) NOT NULL COMMENT '分类中文名称',
  `type` enum('mat_pilates','equipment_pilates') NOT NULL DEFAULT 'mat_pilates' COMMENT '普拉提类型：垫上普拉提或器械普拉提',
  `equipment_name` varchar(255) DEFAULT NULL COMMENT '器械名称（仅器械普拉提需要）',
  `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序（升序）',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`key`),
  KEY `idx_sort_order` (`sort_order`),
  KEY `idx_type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='普拉提训练分类表';

-- 创建动作表
CREATE TABLE `t_exercises` (
  `key` varchar(255) NOT NULL COMMENT '动作唯一键（英文/下划线）',
  `name` varchar(255) NOT NULL COMMENT '动作名称',
  `category_name` varchar(255) NOT NULL COMMENT '中文分类名（冗余，便于展示）',
  `description` text DEFAULT NULL COMMENT '动作描述',
  `target_muscle_groups` text NOT NULL COMMENT '主要锻炼肌肉群',
  `equipment_name` varchar(255) DEFAULT NULL COMMENT '器械名称（器械普拉提专用）',
  `beginner_reps` int DEFAULT NULL COMMENT '入门级别建议练习次数',
  `beginner_sets` int DEFAULT NULL COMMENT '入门级别建议组数',
  `breathing_cycles` int DEFAULT NULL COMMENT '呼吸循环次数（替代普通次数）',
  `hold_duration` int DEFAULT NULL COMMENT '保持时间（秒）',
  `special_instructions` varchar(255) DEFAULT NULL COMMENT '特殊说明（如每侧、前后各等）',
  `category_key` varchar(255) NOT NULL COMMENT '分类键',
  `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序（分类内）',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`key`),
  KEY `idx_category_key` (`category_key`),
  KEY `idx_sort_order` (`sort_order`),
  KEY `idx_category_sort` (`category_key`, `sort_order`),
  KEY `idx_equipment_name` (`equipment_name`),
  CONSTRAINT `fk_exercises_category` FOREIGN KEY (`category_key`) REFERENCES `t_exercise_categories` (`key`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='普拉提训练动作表';

-- 创建训练计划表
CREATE TABLE `t_training_plans` (
  `id` char(36) NOT NULL COMMENT '训练计划唯一ID',
  `is_active` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否激活',
  `user_id` varchar(255) NOT NULL COMMENT '用户ID',
  `name` varchar(255) DEFAULT NULL COMMENT '计划名称',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `start_date` datetime NOT NULL COMMENT '开始日期',
  `mode` enum('daysOfWeek','sessionsPerWeek') NOT NULL COMMENT '计划模式',
  `days_of_week` json NOT NULL COMMENT '周几训练（0-6）',
  `sessions_per_week` int NOT NULL COMMENT '每周训练次数',
  `goal` enum('postpartum_recovery','fat_loss','posture_correction','core_strength','flexibility','rehab','stress_relief','') NOT NULL COMMENT '训练目标',
  `start_weight_kg` float DEFAULT NULL COMMENT '起始体重（公斤）',
  `preferred_time_of_day` enum('morning','noon','evening','') NOT NULL DEFAULT '' COMMENT '偏好训练时间',
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已删除',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_is_active` (`is_active`),
  KEY `idx_deleted` (`deleted`),
  KEY `idx_user_active` (`user_id`, `is_active`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='训练计划表';

-- 创建训练计划动作表
CREATE TABLE `t_schedule_exercises` (
  `id` char(36) NOT NULL COMMENT '计划动作唯一ID',
  `training_plan_id` char(36) NOT NULL COMMENT '训练计划ID',
  `user_id` varchar(255) NOT NULL COMMENT '用户ID',
  `exercise_key` varchar(255) DEFAULT NULL COMMENT '关联的动作key（仅exercise类型）',
  `name` varchar(255) NOT NULL COMMENT '项目名称',
  `sets` int DEFAULT NULL COMMENT '组数',
  `reps` int DEFAULT NULL COMMENT '重复次数',
  `duration_sec` int DEFAULT NULL COMMENT '持续时长(秒)',
  `rest_sec` int DEFAULT NULL COMMENT '休息时长(秒)',
  `note` text DEFAULT NULL COMMENT '备注',
  `item_type` enum('exercise','rest','note') NOT NULL DEFAULT 'exercise' COMMENT '项目类型',
  `completed` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已完成',
  `sort_order` int NOT NULL COMMENT '排序顺序',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已删除',
  PRIMARY KEY (`id`),
  KEY `idx_training_plan_id` (`training_plan_id`),
  KEY `idx_exercise_key` (`exercise_key`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_sort_order` (`sort_order`),
  KEY `idx_item_type` (`item_type`),
  KEY `idx_plan_sort` (`training_plan_id`, `sort_order`),
  CONSTRAINT `fk_schedule_exercises_training_plan` FOREIGN KEY (`training_plan_id`) REFERENCES `t_training_plans` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_schedule_exercises_exercise` FOREIGN KEY (`exercise_key`) REFERENCES `t_exercises` (`key`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='训练计划动作表';

-- 创建索引以优化查询性能
-- 分类表索引已在建表时创建

-- 动作表额外索引
CREATE INDEX `idx_target_muscle_groups` ON `t_exercises` (`target_muscle_groups`(100));

-- 插入初始数据
-- 插入普拉提分类数据
INSERT INTO `t_exercise_categories` (`key`, `name`, `type`, `equipment_name`, `sort_order`, `created_at`, `updated_at`) VALUES
-- 垫上普拉提
('mat_pilates', '垫上普拉提', 'mat_pilates', NULL, 1, NOW(), NOW()),

-- 器械普拉提
('reformer', '核心床', 'equipment_pilates', '核心床', 2, NOW(), NOW()),
('cadillac', '凯迪拉克', 'equipment_pilates', '凯迪拉克', 3, NOW(), NOW()),
('chair', '普拉提椅', 'equipment_pilates', '普拉提椅', 4, NOW(), NOW()),
('barrel', '普拉提桶', 'equipment_pilates', '普拉提桶', 5, NOW(), NOW());

-- 插入垫上普拉提动作数据
INSERT INTO `t_exercises` (
  `key`, `name`, `category_name`, `description`, `target_muscle_groups`, `equipment_name`, 
  `beginner_reps`, `beginner_sets`, `breathing_cycles`, `hold_duration`, `special_instructions`, 
  `category_key`, `sort_order`, `created_at`, `updated_at`
) VALUES
('mat_hundred', '百次拍打', '垫上普拉提', '经典的普拉提动作，通过有节奏的手臂拍打配合呼吸来激活核心', '核心肌群、呼吸肌群、肩部稳定性', NULL, NULL, NULL, 10, NULL, '10个呼吸循环', 'mat_pilates', 1, NOW(), NOW()),

('mat_roll_up', '卷起', '垫上普拉提', '从仰卧位缓慢卷起至坐姿，锻炼脊柱逐节控制能力', '核心肌群、脊柱灵活性、腘绳肌柔韧性', NULL, 6, NULL, NULL, NULL, NULL, 'mat_pilates', 2, NOW(), NOW()),

('mat_single_leg_circle', '单腿画圈', '垫上普拉提', '单腿做圆周运动，保持骨盆稳定', '核心稳定性、髋关节灵活性、股四头肌、腘绳肌、臀肌', NULL, 5, NULL, NULL, NULL, '每条腿每个方向5次', 'mat_pilates', 3, NOW(), NOW()),

('mat_rolling_like_ball', '滚球', '垫上普拉提', '保持紧凑姿势前后滚动，挑战平衡和控制', '核心肌群、脊柱柔韧性、平衡感', NULL, 8, NULL, NULL, NULL, '6-8次', 'mat_pilates', 4, NOW(), NOW()),

('mat_single_leg_stretch', '单腿伸展', '垫上普拉提', '交替单腿伸展，保持上身抬起', '核心肌群、髋屈肌、股四头肌', NULL, 10, NULL, NULL, NULL, '每侧8-10次', 'mat_pilates', 5, NOW(), NOW()),

('mat_double_leg_stretch', '双腿伸展', '垫上普拉提', '双腿和手臂同时伸展，回到起始位置', '核心肌群、髋屈肌、股四头肌、肩部稳定性', NULL, 10, NULL, NULL, NULL, '6-10次', 'mat_pilates', 6, NOW(), NOW()),

('mat_spine_stretch', '脊柱伸展', '垫上普拉提', '坐姿前屈，逐节伸展脊柱', '脊柱柔韧性、腘绳肌伸展、核心控制', NULL, 6, NULL, NULL, NULL, NULL, 'mat_pilates', 7, NOW(), NOW()),

('mat_saw', '锯式', '垫上普拉提', '坐姿扭转配合前屈，增强脊柱旋转能力', '腹斜肌、背部伸肌、脊柱旋转灵活性', NULL, 6, NULL, NULL, NULL, '每侧6次', 'mat_pilates', 8, NOW(), NOW()),

('mat_swan', '天鹅式', '垫上普拉提', '俯卧位脊柱后伸，强化背部肌群', '背部伸肌、臀肌、腘绳肌', NULL, 6, NULL, NULL, NULL, NULL, 'mat_pilates', 9, NOW(), NOW()),

('mat_shoulder_bridge', '肩桥', '垫上普拉提', '仰卧抬臀，激活后链肌群', '臀肌、腘绳肌、下背部、脊柱灵活性', NULL, 6, NULL, NULL, NULL, NULL, 'mat_pilates', 10, NOW(), NOW());

-- 插入核心床(Reformer)动作数据
INSERT INTO `t_exercises` (
  `key`, `name`, `category_name`, `description`, `target_muscle_groups`, `equipment_name`, 
  `beginner_reps`, `beginner_sets`, `breathing_cycles`, `hold_duration`, `special_instructions`, 
  `category_key`, `sort_order`, `created_at`, `updated_at`
) VALUES
('reformer_footwork', '脚部练习系列', '核心床', '在核心床上进行各种脚部位置的推蹬练习', '腿部、足部、核心稳定性', '核心床', 10, NULL, NULL, NULL, NULL, 'reformer', 1, NOW(), NOW()),

('reformer_hundred', '百次拍打', '核心床', '在核心床上进行百次拍打，增加阻力挑战', '核心肌群、呼吸肌群、上身耐力', '核心床', NULL, NULL, 10, NULL, '10个呼吸循环', 'reformer', 2, NOW(), NOW()),

('reformer_bridge', '桥式', '核心床', '在核心床上进行桥式动作，利用弹簧阻力', '臀肌、腘绳肌、脊柱关节', '核心床', 10, NULL, NULL, NULL, '6-10次', 'reformer', 3, NOW(), NOW()),

('reformer_straps', '脚套带练习', '核心床', '使用脚套带进行各种腿部和髋部练习', '髋部灵活性、骨盆稳定性、身体控制、内收肌', '核心床', 10, NULL, NULL, NULL, '8-10次', 'reformer', 4, NOW(), NOW()),

('reformer_elephant', '象式', '核心床', '四点跪撑位置进行推拉练习', '核心肌群、腘绳肌、背部伸肌、肩部稳定性', '核心床', 10, NULL, NULL, NULL, '8-10次', 'reformer', 5, NOW(), NOW()),

('reformer_knee_stretch', '跪姿伸展系列', '核心床', '跪姿位置进行多种伸展动作', '核心肌群、髋部灵活性、肩部控制', '核心床', 10, NULL, NULL, NULL, NULL, 'reformer', 6, NOW(), NOW());

-- 插入凯迪拉克(Cadillac)动作数据
INSERT INTO `t_exercises` (
  `key`, `name`, `category_name`, `description`, `target_muscle_groups`, `equipment_name`, 
  `beginner_reps`, `beginner_sets`, `breathing_cycles`, `hold_duration`, `special_instructions`, 
  `category_key`, `sort_order`, `created_at`, `updated_at`
) VALUES
('cadillac_leg_springs', '腿部弹簧系列', '凯迪拉克', '使用腿部弹簧进行各种腿部强化练习', '腘绳肌、股四头肌、臀肌、髋屈肌、内收肌', '凯迪拉克', 20, NULL, NULL, NULL, '10-20次', 'cadillac', 1, NOW(), NOW()),

('cadillac_arm_springs', '手臂弹簧系列', '凯迪拉克', '使用手臂弹簧进行上身力量训练', '胸部、肩部、上背部、手臂', '凯迪拉克', 15, NULL, NULL, NULL, '10-15次', 'cadillac', 2, NOW(), NOW()),

('cadillac_roll_down_bar', '滚背杆卷下', '凯迪拉克', '使用滚背杆进行脊柱逐节控制练习', '腹部肌肉、脊柱灵活性', '凯迪拉克', 12, NULL, NULL, NULL, '8-12次', 'cadillac', 3, NOW(), NOW()),

('cadillac_push_through_bar', '推杆', '凯迪拉克', '推拉横杆进行全身协调练习', '肩部、核心、背部', '凯迪拉克', 12, NULL, NULL, NULL, '8-12次', 'cadillac', 4, NOW(), NOW());

-- 插入普拉提椅(Chair)动作数据
INSERT INTO `t_exercises` (
  `key`, `name`, `category_name`, `description`, `target_muscle_groups`, `equipment_name`, 
  `beginner_reps`, `beginner_sets`, `breathing_cycles`, `hold_duration`, `special_instructions`, 
  `category_key`, `sort_order`, `created_at`, `updated_at`
) VALUES
('chair_seated_march', '坐姿行进', '普拉提椅', '坐在椅子上进行交替抬腿练习', '核心肌群、髋屈肌', '普拉提椅', 12, NULL, NULL, NULL, '每侧10-12次', 'chair', 1, NOW(), NOW()),

('chair_seated_leg_lift', '坐姿抬腿', '普拉提椅', '坐姿单腿伸展练习', '股四头肌、核心肌群', '普拉提椅', 12, NULL, NULL, NULL, '每侧10-12次', 'chair', 2, NOW(), NOW()),

('chair_seated_arm_circles', '坐姿手臂画圈', '普拉提椅', '坐姿手臂做圆周运动', '肩部、上背部、手臂', '普拉提椅', 12, NULL, NULL, NULL, '前后各10-12次', 'chair', 3, NOW(), NOW()),

('chair_spine_twist', '脊柱扭转', '普拉提椅', '坐姿脊柱旋转练习', '腹斜肌、脊柱旋转肌', '普拉提椅', 10, NULL, NULL, NULL, '每侧8-10次', 'chair', 4, NOW(), NOW()),

('chair_squat', '椅子深蹲', '普拉提椅', '使用椅子进行深蹲练习', '臀肌、股四头肌、腘绳肌、核心', '普拉提椅', 12, NULL, NULL, NULL, '10-12次', 'chair', 5, NOW(), NOW());

-- 插入普拉提桶(Barrel)动作数据
INSERT INTO `t_exercises` (
  `key`, `name`, `category_name`, `description`, `target_muscle_groups`, `equipment_name`, 
  `beginner_reps`, `beginner_sets`, `breathing_cycles`, `hold_duration`, `special_instructions`, 
  `category_key`, `sort_order`, `created_at`, `updated_at`
) VALUES
('barrel_spine_stretch', '脊柱伸展', '普拉提桶', '在桶上进行脊柱后伸练习', '核心肌群、脊柱伸肌、背部肌肉', '普拉提桶', 12, 3, NULL, NULL, '10-12次，2-3组', 'barrel', 1, NOW(), NOW()),

('barrel_mermaid', '美人鱼伸展', '普拉提桶', '侧坐在桶上进行侧向伸展', '核心肌群、腹斜肌、侧向柔韧性', '普拉提桶', 10, 3, NULL, NULL, '每侧8-10次，2-3组', 'barrel', 2, NOW(), NOW()),

('barrel_side_bend', '侧弯', '普拉提桶', '侧卧在桶上进行侧向弯曲练习', '腹斜肌、腰部塑形、平衡感、核心稳定性', '普拉提桶', 10, 3, NULL, NULL, '每侧8-10次，2-3组', 'barrel', 3, NOW(), NOW()),

('barrel_teaser_prep', '预备式Teaser', '普拉提桶', '在桶上进行Teaser动作的预备练习', '核心肌群、平衡感、本体感受', '普拉提桶', 5, 2, NULL, 3, '5次，2组，保持3秒', 'barrel', 4, NOW(), NOW()),

('barrel_swan_dive_prep', '预备式Swan Dive', '普拉提桶', '在桶上进行Swan Dive的预备练习', '背部伸肌、脊柱伸展、平衡感', '普拉提桶', 5, 2, NULL, 3, '5次，2组，保持3秒', 'barrel', 5, NOW(), NOW());

-- 验证数据插入结果
SELECT 
  ec.name as category_name,
  ec.type,
  ec.equipment_name,
  COUNT(e.key) as exercise_count
FROM t_exercise_categories ec
LEFT JOIN t_exercises e ON ec.key = e.category_key
GROUP BY ec.key, ec.name, ec.type, ec.equipment_name
ORDER BY ec.sort_order;

-- 验证表结构
SELECT 
  TABLE_NAME,
  TABLE_COMMENT,
  TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = DATABASE() 
  AND TABLE_NAME IN ('t_exercise_categories', 't_exercises', 't_training_plans', 't_schedule_exercises')
ORDER BY TABLE_NAME;

-- 验证外键约束
SELECT 
  CONSTRAINT_NAME,
  TABLE_NAME,
  COLUMN_NAME,
  REFERENCED_TABLE_NAME,
  REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_SCHEMA = DATABASE() 
  AND REFERENCED_TABLE_NAME IS NOT NULL
  AND TABLE_NAME IN ('t_exercises', 't_schedule_exercises')
ORDER BY TABLE_NAME, CONSTRAINT_NAME;
