package com.ga.core.mapper.settle;

import com.ga.core.vo.settle.CarrierReconciliationOutResp;
import com.ga.core.vo.settle.CarrierReconciliationOutSearchParam;
import com.ga.core.vo.settle.CarrierReconciliationOutVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 보험사 회신 인터페이스 (아웃바운드) Mapper
 * carrier_reconciliation_out 테이블 CRUD + 상태 관리.
 */
@Mapper
public interface CarrierReconciliationOutMapper {

    /** 전송 이력 목록 조회 (페이징) */
    List<CarrierReconciliationOutResp> selectList(CarrierReconciliationOutSearchParam param);

    /** 전송 이력 단건 조회 (응답 조인 포함) */
    CarrierReconciliationOutResp selectById(@Param("reconOutId") Long reconOutId);

    /** 전송 이력 단건 조회 (VO, 배치 처리용) */
    CarrierReconciliationOutVO selectVoById(@Param("reconOutId") Long reconOutId);

    /** 보험사 + 정산월 기준 조회 (UNIQUE KEY) */
    CarrierReconciliationOutVO selectByCarrierMonth(@Param("carrierId") Long carrierId,
                                                    @Param("settleMonth") String settleMonth);

    /** 전송 이력 등록 */
    int insert(CarrierReconciliationOutVO vo);

    /** 상태 변경 (SENT/ACK/FAIL) */
    int updateStatus(@Param("reconOutId") Long reconOutId,
                     @Param("status") String status);

    /** 전송 완료 처리 (sentAt 기록) */
    int markSent(@Param("reconOutId") Long reconOutId);

    /** 수신 확인 처리 (ackAt + ackMessage 기록) */
    int markAck(@Param("reconOutId") Long reconOutId,
                @Param("ackMessage") String ackMessage);

    /** 실패 처리 (failReason + retryCount 증가) */
    int markFail(@Param("reconOutId") Long reconOutId,
                 @Param("failReason") String failReason);
}
