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

import egovframework.exception.MessageException;
import egovframework.util.SessionUtil;
import go.kr.project.api.mapper.VmisCarLedgerFrmbkMapper;
import go.kr.project.api.model.CarLedgerFrmbkDtlVO;
import go.kr.project.api.model.CarLedgerFrmbkVO;
import go.kr.project.api.model.response.NewLedgerResponse;
import go.kr.project.api.service.VmisCarLedgerFrmbkLogService;
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;

import java.util.List;

/**
 * 자동차 등록 원부(갑) 로그 전용 서비스 구현체
 * - 모든 로깅(write)은 별도 트랜잭션(REQUIRES_NEW)으로 수행하여 상위 트랜잭션 롤백의 영향을 받지 않도록 한다.
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class VmisCarLedgerFrmbkLogServiceImpl extends EgovAbstractServiceImpl implements VmisCarLedgerFrmbkLogService {

    private final VmisCarLedgerFrmbkMapper mapper;

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public String createInitialRequestNewTx(CarLedgerFrmbkVO request) {
        String id = mapper.selectNextCarLedgerFrmbkId();
        request.setCarLedgerFrmbkId(id);
        if( SessionUtil.getUserId() != null ){
            request.setRgtr(SessionUtil.getUserId());
        }
        int result = mapper.insertCarLedgerFrmbk(request);
        if (result != 1) {
            throw new MessageException("자동차 등록 원부(갑) 최초요청 등록 실패");
        }
        log.info("[LEDGER-REQ-LOG] 최초 요청 저장(별도TX) - ID: {}, 차량번호: {}", id, request.getDmndVhrno());
        return id;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateResponseNewTx(CarLedgerFrmbkVO response) {
        if (response.getCarLedgerFrmbkId() == null) {
            throw new IllegalArgumentException("자동차 등록 원부(갑) ID는 필수입니다.");
        }
        int updated = mapper.updateCarLedgerFrmbk(response);
        if (updated != 1) {
            throw new MessageException("자동차 등록 원부(갑) 정보 업데이트 실패 - ID: " + response.getCarLedgerFrmbkId());
        }
        log.info("[LEDGER-RES-LOG] 마스터 응답 업데이트(별도TX) - ID: {}, 결과코드: {}",
                response.getCarLedgerFrmbkId(), response.getLinkRsltCd());
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void saveDetailsNewTx(String masterId, List<CarLedgerFrmbkDtlVO> details) {
        if (details == null || details.isEmpty()) return;
        for (CarLedgerFrmbkDtlVO dtl : details) {
            String dtlId = mapper.selectNextCarLedgerFrmbkDtlId();
            dtl.setCarLedgerFrmbkDtlId(dtlId);
            dtl.setCarLedgerFrmbkId(masterId);
            mapper.insertCarLedgerFrmbkDtl(dtl);
        }
        log.info("[LEDGER-RES-LOG] 상세 {}건 저장(별도TX) - ID: {}", details.size(), masterId);
    }

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

}
