package com.ga.api.service.upload;

import com.ga.core.mapper.upload.UploadHistoryMapper;
import com.ga.core.vo.upload.UploadHistoryVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * UploadService의 트랜잭션 경계를 분리한 헬퍼.
 *
 * UploadService 내에서 self-invocation으로는 프록시가 적용되지 않으므로
 * 별도 Bean으로 분리하여 REQUIRES_NEW 트랜잭션을 보장한다.
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class UploadTxHelper {

    private final UploadHistoryMapper historyMapper;
    private final DynamicInsertMapper dynamicInsertMapper;

    /** history INSERT를 독립 트랜잭션으로 커밋 — 본 작업 실패 시에도 기록이 남는다. */
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void saveHistory(UploadHistoryVO history) {
        historyMapper.insert(history);
    }

    /** 배치 INSERT를 독립 트랜잭션으로 커밋 — 청크 단위 커밋으로 커넥션 점유 시간 단축. */
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public int insertBatch(String targetTable, List<Map<String, Object>> batch) {
        dynamicInsertMapper.insertBatch(targetTable, batch);
        return batch.size();
    }

    /** history 상태 갱신을 독립 트랜잭션으로 커밋. */
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateHistory(Long historyId, String status, String errorMessage,
                              int successCount, int errorCount, int skipCount,
                              int totalCount, Long errorFileId, int durationSec) {
        historyMapper.updateStatus(historyId, status, errorMessage,
                successCount, errorCount, skipCount, totalCount, errorFileId, durationSec);
    }
}
