-- ============================================
-- 크레딧 관리 테이블 생성 스크립트
-- 데이터베이스: mlink_db
-- ============================================

USE mlink_db;

-- ============================================
-- 1. credit_transactions 테이블 (크레딧 거래 내역)
-- ============================================
CREATE TABLE IF NOT EXISTS `credit_transactions` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `user_id` INT NOT NULL,
    `credit_type` ENUM(
        'event',              -- 이벤트 크레딧
        'free',               -- 무료 크레딧
        'daily_renewal',      -- 매일 갱신 크레딧
        'subscription_basic', -- Basic 구독 크레딧
        'subscription_plus',  -- Plus 구독 크레딧
        'subscription_pro',   -- Pro 구독 크레딧
        'add_on',             -- 추가 크레딧 구입
        'usage'               -- 크레딧 사용
    ) NOT NULL,
    `amount` INT NOT NULL COMMENT '양수면 추가, 음수면 사용',
    `balance_after` INT NOT NULL COMMENT '거래 후 잔액',
    `description` TEXT COMMENT '거래 설명 (예: "회원가입 보너스", "AI 챗봇 사용" 등)',
    `reference_id` VARCHAR(100) COMMENT '참조 ID (구독 ID, 결제 ID 등)',
    `reference_type` VARCHAR(50) COMMENT '참조 타입 (subscription, payment, usage 등)',
    `meta_data` TEXT COMMENT 'JSON 형태로 추가 정보 저장',
    `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    INDEX `idx_user_id` (`user_id`),
    INDEX `idx_created_at` (`created_at`),
    INDEX `idx_credit_type` (`credit_type`),
    INDEX `idx_reference` (`reference_type`, `reference_id`),
    CONSTRAINT `fk_credit_transactions_user` 
        FOREIGN KEY (`user_id`) 
        REFERENCES `user` (`id`) 
        ON DELETE CASCADE 
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='크레딧 거래 내역 테이블';

-- ============================================
-- 2. credit_balances 테이블 (사용자별 크레딧 잔액)
-- ============================================
CREATE TABLE IF NOT EXISTS `credit_balances` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `user_id` INT NOT NULL,
    `total_credit` INT NOT NULL DEFAULT 0 COMMENT '총 크레딧',
    `free_credit` INT NOT NULL DEFAULT 0 COMMENT '무료 크레딧',
    `event_credit` INT NOT NULL DEFAULT 0 COMMENT '이벤트 크레딧',
    `daily_renewal_credit` INT NOT NULL DEFAULT 0 COMMENT '매일 갱신 크레딧',
    `subscription_credit` INT NOT NULL DEFAULT 0 COMMENT '구독 크레딧',
    `add_on_credit` INT NOT NULL DEFAULT 0 COMMENT '추가 구입 크레딧',
    `last_daily_renewal` DATETIME COMMENT '마지막 일일 갱신 시간',
    `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_user_id` (`user_id`),
    INDEX `idx_total_credit` (`total_credit`),
    CONSTRAINT `fk_credit_balances_user` 
        FOREIGN KEY (`user_id`) 
        REFERENCES `user` (`id`) 
        ON DELETE CASCADE 
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='사용자별 크레딧 잔액 테이블';

-- ============================================
-- 3. 초기 데이터 설정 (선택사항)
-- ============================================
-- 기존 사용자들에게 기본 크레딧 잔액 레코드 생성 (필요시 실행)
-- INSERT INTO credit_balances (user_id, total_credit, free_credit, event_credit)
-- SELECT id, 0, 0, 0 FROM user
-- WHERE id NOT IN (SELECT user_id FROM credit_balances);

-- ============================================
-- 4. 인덱스 최적화 (선택사항)
-- ============================================
-- 크레딧 거래 내역 조회 성능 향상을 위한 복합 인덱스
-- ALTER TABLE credit_transactions ADD INDEX idx_user_created (user_id, created_at DESC);

-- ============================================
-- 완료 메시지
-- ============================================
SELECT '크레딧 테이블 생성이 완료되었습니다.' AS message;

