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

import go.kr.project.api.config.ApiConstant;
import go.kr.project.api.internal.client.GovernmentApi;
import go.kr.project.api.internal.service.VmisCarBassMatterInqireService;
import go.kr.project.api.internal.service.VmisRequestEnricher;
import go.kr.project.api.internal.util.ExceptionDetailUtil;
import go.kr.project.api.model.Envelope;
import go.kr.project.api.model.request.BasicRequest;
import go.kr.project.api.model.response.BasicResponse;
import go.kr.project.api.model.response.VmisCarBassMatterInqireVO;
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.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 자동차 기본 사항 조회 서비스 구현체
 *
 * <p>API 호출 정보를 관리하는 서비스 클래스입니다.</p>
 * <ul>
 *   <li>최초 요청: createInitialRequest() - 시퀀스로 ID 생성 후 INSERT</li>
 *   <li>결과 업데이트: updateResponse() - 응답 데이터 UPDATE</li>
 * </ul>
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class VmisCarBassMatterInqireServiceImpl extends EgovAbstractServiceImpl implements VmisCarBassMatterInqireService {

    private final GovernmentApi governmentApi;
    private final VmisRequestEnricher enricher;
    private final VmisCarBassMatterInqireLogService logService;

    /**
     * 자동차 기본사항 조회: 보강 -> 최초요청로그 -> 외부호출 -> 응답로그.
     */
    @Override
    @Transactional
    public ResponseEntity<Envelope<BasicResponse>> basic(Envelope<BasicRequest> envelope) {
        // 1) 요청 보강
        enricher.enrichBasic(envelope);

        String generatedId = null;
        try {
            // 2) 최초 요청 로그 저장 (첫 번째 데이터 기준)
            if (envelope.getData() != null && !envelope.getData().isEmpty()) {
                BasicRequest req = envelope.getData().get(0);
                VmisCarBassMatterInqireVO logEntity = VmisCarBassMatterInqireVO.fromRequest(req);
                generatedId = logService.createInitialRequestNewTx(logEntity);
            }

            // 3) 외부 API 호출
            ResponseEntity<Envelope<BasicResponse>> response = governmentApi.callBasic(envelope);

            // 4) 응답 로그 업데이트
            // 원본 소스, 정상적인 호출, 리턴(에러 리턴포함) 일 경우에만 에러 로그 남김
            if (generatedId != null && response.getBody() != null) {
                VmisCarBassMatterInqireVO update = VmisCarBassMatterInqireVO.fromResponse(generatedId, response.getBody());
                if (update != null) {
                    logService.updateResponseNewTx(update);
                }
            }

            return response;
        } catch (Exception e) {
            // 5) 오류 로그 업데이트
            if (generatedId != null) {
                try {
                    String detail = ExceptionDetailUtil.buildForLog(e);
                    VmisCarBassMatterInqireVO errorLog = VmisCarBassMatterInqireVO.builder()
                            .carBassMatterInqireId(generatedId)  // 자동차기본사항조회 ID (PK)
                            .cntcResultCode(ApiConstant.CNTC_RESULT_CODE_ERROR)  // 연계결과코드 (에러)
                            .cntcResultDtls(detail)            // 연계결과상세 (에러 메시지)
                            .build();
                    logService.updateResponseNewTx(errorLog);
                    log.error("[BASIC-ERR-LOG] API 호출 에러 정보 저장 완료(별도TX) - ID: {}, detail: {}", generatedId, detail, e);
                } catch (Exception ignore) {
                    log.error("[BASIC-ERR-LOG] 에러 로그 저장 실패 - ID: {}", generatedId, ignore);
                }
            }
            throw e;
        }
    }
}
