-- 药物管理相关表创建脚本
-- 创建时间: 2025-01-15
-- 说明: 包含药物信息表和服药记录表

-- ==========================================
-- 1. 药物信息表 (t_medications)
-- ==========================================
CREATE TABLE IF NOT EXISTS `t_medications` (
  `id` varchar(50) NOT NULL COMMENT '药物唯一标识',
  `user_id` varchar(50) NOT NULL COMMENT '用户ID',
  `name` varchar(100) NOT NULL COMMENT '药物名称',
  `photo_url` varchar(255) DEFAULT NULL COMMENT '药物照片URL',
  `form` varchar(20) NOT NULL COMMENT '药物剂型：capsule/pill/injection/spray/drop/syrup/other',
  `dosage_value` decimal(10,2) NOT NULL COMMENT '剂量数值',
  `dosage_unit` varchar(20) NOT NULL COMMENT '剂量单位（片、粒、毫升等）',
  `times_per_day` int NOT NULL COMMENT '每日服用次数',
  `medication_times` json NOT NULL COMMENT '服药时间列表，格式：["08:00", "20:00"]',
  `repeat_pattern` varchar(20) NOT NULL DEFAULT 'daily' COMMENT '重复模式：daily/weekly/custom',
  `start_date` datetime NOT NULL COMMENT '开始日期（UTC时间）',
  `end_date` datetime DEFAULT NULL COMMENT '结束日期（UTC时间，可选）',
  `note` text COMMENT '备注信息',
  `is_active` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否激活：1=激活，0=停用',
  `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 '软删除标记：0=未删除，1=已删除',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_is_active` (`is_active`),
  KEY `idx_user_active` (`user_id`, `is_active`),
  KEY `idx_deleted` (`deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='药物信息表';

-- ==========================================
-- 2. 服药记录表 (t_medication_records)
-- ==========================================
CREATE TABLE IF NOT EXISTS `t_medication_records` (
  `id` varchar(50) NOT NULL COMMENT '记录唯一标识',
  `medication_id` varchar(50) NOT NULL COMMENT '关联的药物ID',
  `user_id` varchar(50) NOT NULL COMMENT '用户ID',
  `scheduled_time` datetime NOT NULL COMMENT '计划服药时间（UTC时间）',
  `actual_time` datetime DEFAULT NULL COMMENT '实际服药时间（UTC时间）',
  `status` varchar(20) NOT NULL COMMENT '服药状态：upcoming/taken/missed/skipped',
  `note` text 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 '软删除标记：0=未删除，1=已删除',
  PRIMARY KEY (`id`),
  KEY `idx_medication_id` (`medication_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_scheduled_time` (`scheduled_time`),
  KEY `idx_status` (`status`),
  KEY `idx_user_scheduled` (`user_id`, `scheduled_time`),
  KEY `idx_user_date_status` (`user_id`, `scheduled_time`, `status`),
  KEY `idx_deleted` (`deleted`),
  CONSTRAINT `fk_medication_records_medication` 
    FOREIGN KEY (`medication_id`) 
    REFERENCES `t_medications` (`id`) 
    ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='服药记录表';

-- ==========================================
-- 3. 索引优化说明
-- ==========================================
-- idx_user_id: 用于快速查询用户的所有药物
-- idx_is_active: 用于筛选激活状态的药物
-- idx_user_active: 复合索引，优化查询用户的激活药物
-- idx_user_scheduled: 复合索引，优化按日期查询用户的服药记录
-- idx_user_date_status: 复合索引，优化统计查询
-- idx_status: 用于定时任务批量更新状态

-- ==========================================
-- 4. 数据约束说明
-- ==========================================
-- 1. form 字段只能是预定义的剂型枚举值
-- 2. repeat_pattern 当前只支持 'daily'
-- 3. status 字段只能是 upcoming/taken/missed/skipped
-- 4. medication_times 必须是有效的 JSON 数组
-- 5. 外键约束确保记录关联的药物存在

-- ==========================================
-- 5. 使用示例
-- ==========================================
-- 插入药物示例:
-- INSERT INTO t_medications (id, user_id, name, form, dosage_value, dosage_unit, 
--   times_per_day, medication_times, repeat_pattern, start_date)
-- VALUES ('med_001', 'user_123', 'Metformin', 'capsule', 1, '粒', 
--   2, '["08:00", "20:00"]', 'daily', '2025-01-01 00:00:00');

-- 插入服药记录示例:
-- INSERT INTO t_medication_records (id, medication_id, user_id, scheduled_time, status)
-- VALUES ('record_001', 'med_001', 'user_123', '2025-01-15 08:00:00', 'upcoming');