package kr.xit.biz.ens.service;

import java.util.List;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import kr.xit.biz.common.ApiConstants;
import kr.xit.biz.ens.cmm.CmmEnsBizUtils;
import kr.xit.biz.ens.mapper.IEnsBatchMapper;
import kr.xit.biz.ens.model.EnsDTO;
import kr.xit.biz.ens.model.cmm.SndngMssageParam;
import kr.xit.core.exception.BizRuntimeException;
import kr.xit.core.service.AbstractService;
import lombok.RequiredArgsConstructor;

/**
 * <pre>
 * description : 모바일 전자고지 배치 서비스
 *               - 배치에서 호출되는 클래스로 배치 로그등 Transaction 분리 필요
 *               - 메소드 트랜잭션 Transactional(propagation = Propagation.REQUIRES_NEW)로 선언
 * packageName : kr.xit.biz.ens.service
 * fileName    : EnsBatchService
 * author      : limju
 * date        : 2023-08-31
 * ======================================================================
 * 변경일         변경자        변경 내용
 * ----------------------------------------------------------------------
 * 2023-08-31    limju       최초 생성
 *
 * </pre>
 */
@RequiredArgsConstructor
@Service
public class EnsBatchCloseService extends AbstractService implements IEnsBatchCloseService {
    private final IEnsBatchMapper mapper;

    /**
     * send-ok 값에 따라 close
     *
     * @param reqDTO BatchEnsRequest
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void close(final EnsDTO.BatchEnsRequest reqDTO) {
        final List<String> list = mapper.selectCloseTgts(reqDTO);

        // 연계발송 마스터(tb_cntc_sndng_mastr) 상태 변경 : send-ok -> close
        for (String id : list) {
            final SndngMssageParam paramDTO = SndngMssageParam.builder()
                .unitySndngMastrId(id)
                .sndngProcessSttus(reqDTO.getSndngProcessSttus())
                .build();

            CmmEnsBizUtils.setMappingProcessStatus(paramDTO, ApiConstants.SndngProcessStatus.CLOSE.getCode());

            if (mapper.updateProcessSttusCntcSndngMst(paramDTO) != 1) {
                throw BizRuntimeException.create("[close]연계 발송 마스터 상태변경 실패");
            }

            paramDTO.setNewSndngProcessSttus(ApiConstants.SndngProcessStatus.CLOSE.getCode());
            if (mapper.updateProcessSttusUnitySndngMst(paramDTO) != 1) {
                throw BizRuntimeException.create("[close]통합 발송 마스터 상태변경 실패");
            }
            // 2차 이상 발송 시 발송 마스터가 1개 이상 존재
            if (mapper.updateProcessSttusBulkSndngMst(paramDTO) < 1) {
                throw BizRuntimeException.create("[close]발송 마스터 상태변경 실패");
            }
        }
    }
}
