CREATE TABLE charge_event_job
(
    id                    BIGINT       NOT NULL AUTO_INCREMENT COMMENT 'PK',
    source_charge_id      BIGINT       NOT NULL COMMENT '이벤트 보너스 지급의 기준이 되는 원본 충전 ID(charge.id)',
    result_charge_id      BIGINT       NULL COMMENT '이벤트 보너스로 생성된 Charge ID(charge.id)',
    member_id             BIGINT       NOT NULL COMMENT '이벤트 보너스를 지급받을 회원 ID(member.id)',
    charge_event_id       BIGINT       NULL COMMENT '적용된 충전 이벤트 ID(charge_event.id), 첫 충전 이벤트처럼 별도 이벤트 row가 없으면 NULL',
    job_type              VARCHAR(30)  NOT NULL COMMENT '작업 유형(FIRST_CHARGE, ACTIVE_CHARGE_EVENT)',
    idempotency_key       VARCHAR(100) NOT NULL COMMENT '중복 작업 방지 키(예: charge-event:{sourceChargeId}:{jobType}:{chargeEventId 또는 none})',
    additional_can        INT          NOT NULL COMMENT '추가 지급할 보너스 캔 수',
    payment_gateway       VARCHAR(30)  NOT NULL COMMENT '원본 충전의 결제 게이트웨이(PG, PAYVERSE, GOOGLE_IAP, APPLE_IAP 등)',
    container             VARCHAR(10)  NOT NULL COMMENT '회원 캔 잔액 반영 대상(pg, aos, ios)',
    method_snapshot       VARCHAR(100) NOT NULL COMMENT '이벤트 보너스 Charge.payment.method에 기록할 지급 사유 스냅샷',
    status                VARCHAR(20)  NOT NULL DEFAULT 'PENDING' COMMENT '작업 상태(PENDING, PROCESSING, DONE, FAILED)',
    retry_count           INT          NOT NULL DEFAULT 0 COMMENT '재시도 횟수',
    next_retry_at         TIMESTAMP    NULL COMMENT '다음 재시도 가능 시각',
    processing_started_at TIMESTAMP    NULL COMMENT 'PROCESSING 상태로 선점한 시각',
    processed_at          TIMESTAMP    NULL COMMENT '지급 성공 처리 시각',
    last_error            TEXT         NULL COMMENT '마지막 실패 사유',
    created_at            TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 시각',
    updated_at            TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 시각',
    PRIMARY KEY (id),
    UNIQUE KEY uk_charge_event_job_idempotency_key (idempotency_key),
    KEY idx_charge_event_job_status_next_retry_at (status, next_retry_at),
    KEY idx_charge_event_job_source_charge_id (source_charge_id),
    KEY idx_charge_event_job_result_charge_id (result_charge_id),
    KEY idx_charge_event_job_member_id (member_id),
    KEY idx_charge_event_job_charge_event_id (charge_event_id),
    CONSTRAINT fk_charge_event_job_source_charge_id
        FOREIGN KEY (source_charge_id) REFERENCES charge (id),
    CONSTRAINT fk_charge_event_job_result_charge_id
        FOREIGN KEY (result_charge_id) REFERENCES charge (id),
    CONSTRAINT fk_charge_event_job_member_id
        FOREIGN KEY (member_id) REFERENCES member (id),
    CONSTRAINT fk_charge_event_job_charge_event_id
        FOREIGN KEY (charge_event_id) REFERENCES charge_event (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='충전 이벤트 보너스 지급 작업';
