package go.kr.project.api.service.impl;

import egovframework.exception.MessageException;
import egovframework.util.SessionUtil;
import go.kr.project.api.mapper.VmisCarBassMatterInqireMapper;
import go.kr.project.api.model.CarBassMatterInqireVO;
import go.kr.project.api.model.response.NewBasicResponse;
import go.kr.project.api.service.VmisCarBassMatterInqireLogService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * 자동차 기본사항 조회 로그 전용 서비스 구현체
 *
 * <p>로그 적재만 별도 트랜잭션(REQUIRES_NEW)으로 처리하여,
 * 외부 호출 실패나 상위 트랜잭션 롤백 상황에서도 로그는 영속화되도록 보장한다.</p>
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class VmisCarBassMatterInqireLogServiceImpl extends EgovAbstractServiceImpl implements VmisCarBassMatterInqireLogService {

    private final VmisCarBassMatterInqireMapper carBassMatterInqireMapper;

    /**
     * 최초 API 요청 정보를 등록한다. (REQUIRES_NEW)
     * @param request 요청 정보
     * @return 생성된 ID
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public String createInitialRequestNewTx(CarBassMatterInqireVO request) {
        String generatedId = carBassMatterInqireMapper.selectNextCarBassMatterInqireId();
        request.setCarBassMatterInqireId(generatedId);
        if( SessionUtil.getUserId() != null ){
            request.setRgtr(SessionUtil.getUserId());
        }
        int result = carBassMatterInqireMapper.insertCarBassMatterInqire(request);
        if (result != 1) {
            throw new MessageException("자동차 기본 사항 조회 정보 등록 실패");
        }
        log.info("[BASIC-REQ-LOG] 요청 정보 저장 완료(별도TX) - ID: {}, 차량번호: {}", generatedId, request.getDmndVhrno());
        return generatedId;
    }

    /**
     * 응답/에러 결과를 업데이트한다. (REQUIRES_NEW)
     * @param response 업데이트 내용
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateResponseNewTx(CarBassMatterInqireVO response) {
        if (response.getCarBassMatterInqireId() == null) {
            throw new IllegalArgumentException("자동차 기본 사항 조회 ID는 필수입니다.");
        }
        int result = carBassMatterInqireMapper.updateCarBassMatterInqire(response);
        if (result != 1) {
            throw new MessageException("자동차 기본 사항 조회 정보 업데이트 실패 - ID: " + response.getCarBassMatterInqireId());
        }
        log.info("[BASIC-RES-LOG] 응답/에러 정보 저장 완료(별도TX) - ID: {}, 결과코드: {}", response.getCarBassMatterInqireId(), response.getLinkRsltCd());
    }

    /**
     * txId로 CAR_FFNLG_TRGT_ID를 업데이트한다. (REQUIRES_NEW)
     * @param response API 응답 객체
     * @param carFfnlgTrgtId 과태료 대상 ID
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateCarFfnlgTrgtIdByTxIdNewTx(NewBasicResponse response, String carFfnlgTrgtId) {
        try {
            if (response != null && response.getTxId() != null) {
                carBassMatterInqireMapper.updateCarFfnlgTrgtIdByTxId(response.getTxId(), carFfnlgTrgtId);
                log.info("[BASIC-FFNLG-LOG] CAR_FFNLG_TRGT_ID 업데이트 완료(별도TX) - txId: {}, CAR_FFNLG_TRGT_ID: {}", response.getTxId(), carFfnlgTrgtId);
            }
        } catch (Exception e) {
            log.error("[BASIC-FFNLG-LOG] CAR_FFNLG_TRGT_ID 업데이트 중 오류 발생 - txId: {}", response != null ? response.getTxId() : null, e);
            // 저장 실패해도 비교 로직은 계속 진행
        }
    }

}
