-- 数据库迁移脚本：添加优惠码和订阅升级相关表
-- 执行时间：2025-xx-xx
-- 作者：Claude Code
-- 说明：此脚本添加了优惠码、优惠码使用记录和订阅升级记录三张新表，并扩展了 payment_orders 表

-- ============================================
-- 1. 创建优惠码表
-- ============================================
CREATE TABLE IF NOT EXISTS `promo_codes` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `code` VARCHAR(50) UNIQUE NOT NULL COMMENT '优惠码（唯一）',
  `description` VARCHAR(200) DEFAULT NULL COMMENT '优惠码描述',

  -- 折扣类型和值
  `discount_type` VARCHAR(20) NOT NULL COMMENT '折扣类型: percentage（百分比） 或 fixed_amount（固定金额）',
  `discount_value` DECIMAL(10, 2) NOT NULL COMMENT '折扣值',

  -- 适用范围
  `applicable_plans` VARCHAR(200) DEFAULT NULL COMMENT '适用套餐（JSON格式），如 ["pro", "max"]，null表示全部适用',
  `applicable_cycles` VARCHAR(50) DEFAULT NULL COMMENT '适用周期（JSON格式），如 ["monthly", "yearly"]，null表示全部适用',
  `min_amount` DECIMAL(10, 2) DEFAULT NULL COMMENT '最低消费金额',

  -- 使用限制
  `max_uses` INT DEFAULT NULL COMMENT '最大使用次数，null表示无限制',
  `max_uses_per_user` INT DEFAULT 1 COMMENT '每个用户最多使用次数',
  `current_uses` INT DEFAULT 0 COMMENT '当前已使用次数',

  -- 有效期
  `valid_from` DATETIME NOT NULL COMMENT '生效时间',
  `valid_until` DATETIME NOT NULL COMMENT '失效时间',

  -- 状态
  `is_active` BOOLEAN DEFAULT TRUE COMMENT '是否启用',
  `created_by` INT DEFAULT NULL COMMENT '创建人（管理员ID）',
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  INDEX idx_code (`code`),
  INDEX idx_valid_dates (`valid_from`, `valid_until`),
  INDEX idx_is_active (`is_active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠码表';


-- ============================================
-- 2. 创建优惠码使用记录表
-- ============================================
CREATE TABLE IF NOT EXISTS `promo_code_usage` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `promo_code_id` INT NOT NULL COMMENT '优惠码ID',
  `user_id` INT NOT NULL COMMENT '用户ID',
  `order_id` INT NOT NULL COMMENT '订单ID',

  `original_amount` DECIMAL(10, 2) NOT NULL COMMENT '原价',
  `discount_amount` DECIMAL(10, 2) NOT NULL COMMENT '优惠金额',
  `final_amount` DECIMAL(10, 2) NOT NULL COMMENT '实付金额',

  `used_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '使用时间',

  FOREIGN KEY (`promo_code_id`) REFERENCES `promo_codes`(`id`) ON DELETE CASCADE,
  FOREIGN KEY (`order_id`) REFERENCES `payment_orders`(`id`) ON DELETE CASCADE,

  INDEX idx_user_id (`user_id`),
  INDEX idx_promo_code_id (`promo_code_id`),
  INDEX idx_order_id (`order_id`),
  INDEX idx_used_at (`used_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠码使用记录表';


-- ============================================
-- 3. 创建订阅升级记录表
-- ============================================
CREATE TABLE IF NOT EXISTS `subscription_upgrades` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `user_id` INT NOT NULL COMMENT '用户ID',
  `order_id` INT NOT NULL COMMENT '订单ID',

  -- 原订阅信息
  `from_plan` VARCHAR(20) NOT NULL COMMENT '原套餐',
  `from_cycle` VARCHAR(10) NOT NULL COMMENT '原周期',
  `from_end_date` DATETIME DEFAULT NULL COMMENT '原到期日',

  -- 新订阅信息
  `to_plan` VARCHAR(20) NOT NULL COMMENT '新套餐',
  `to_cycle` VARCHAR(10) NOT NULL COMMENT '新周期',
  `to_end_date` DATETIME NOT NULL COMMENT '新到期日',

  -- 价格计算
  `remaining_value` DECIMAL(10, 2) NOT NULL COMMENT '剩余价值',
  `upgrade_amount` DECIMAL(10, 2) NOT NULL COMMENT '升级应付金额',
  `actual_amount` DECIMAL(10, 2) NOT NULL COMMENT '实际支付金额',

  `upgrade_type` VARCHAR(20) NOT NULL COMMENT '升级类型: plan_upgrade（套餐升级）, cycle_change（周期变更）, both（都变更）',
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,

  FOREIGN KEY (`order_id`) REFERENCES `payment_orders`(`id`) ON DELETE CASCADE,

  INDEX idx_user_id (`user_id`),
  INDEX idx_order_id (`order_id`),
  INDEX idx_created_at (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订阅升级/降级记录表';


-- ============================================
-- 4. 扩展 payment_orders 表（添加新字段）
-- ============================================
-- 注意：这些字段是可选的扩展，用于记录优惠码和升级信息
-- 如果字段已存在会报错，可以忽略

ALTER TABLE `payment_orders`
ADD COLUMN `promo_code_id` INT DEFAULT NULL COMMENT '使用的优惠码ID' AFTER `remark`,
ADD COLUMN `original_amount` DECIMAL(10, 2) DEFAULT NULL COMMENT '原价（使用优惠码前）' AFTER `promo_code_id`,
ADD COLUMN `discount_amount` DECIMAL(10, 2) DEFAULT 0 COMMENT '优惠金额' AFTER `original_amount`,
ADD COLUMN `is_upgrade` BOOLEAN DEFAULT FALSE COMMENT '是否为升级订单' AFTER `discount_amount`,
ADD COLUMN `upgrade_from_plan` VARCHAR(20) DEFAULT NULL COMMENT '从哪个套餐升级' AFTER `is_upgrade`;

-- 添加外键约束
ALTER TABLE `payment_orders`
ADD CONSTRAINT `fk_payment_orders_promo_code`
FOREIGN KEY (`promo_code_id`) REFERENCES `promo_codes`(`id`) ON DELETE SET NULL;


-- ============================================
-- 5. 插入示例优惠码（供测试使用）
-- ============================================
-- 10% 折扣优惠码，适用所有套餐和周期
INSERT INTO `promo_codes`
(`code`, `description`, `discount_type`, `discount_value`, `applicable_plans`, `applicable_cycles`, `min_amount`, `max_uses`, `max_uses_per_user`, `valid_from`, `valid_until`, `is_active`)
VALUES
('WELCOME10', '新用户欢迎优惠 - 10%折扣', 'percentage', 10.00, NULL, NULL, NULL, NULL, 1, NOW(), DATE_ADD(NOW(), INTERVAL 1 YEAR), TRUE),
('ANNUAL20', '年付专享 - 20%折扣', 'percentage', 20.00, NULL, '["yearly"]', NULL, 100, 1, NOW(), DATE_ADD(NOW(), INTERVAL 1 YEAR), TRUE),
('SUMMER50', '夏季促销 - 减免50元', 'fixed_amount', 50.00, '["max"]', NULL, 100.00, 50, 1, NOW(), DATE_ADD(NOW(), INTERVAL 3 MONTH), TRUE);

-- 完成
SELECT 'Migration completed successfully!' AS status;
