package com.ga.core.mapper.settle;

import com.ga.core.vo.settle.PaymentBatchItemResp;
import com.ga.core.vo.settle.PaymentBatchItemVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * payment_batch_item Mapper — 지급대상건 (V115)
 */
@Mapper
public interface PaymentBatchItemMapper {

    /**
     * settle_master 에서 해당 정산월 지급대상(payable_amount>0, status!='PAID')을
     * payment_batch_item 으로 일괄 INSERT-SELECT.
     * included=true 로 전체 포함 초기화.
     * 배치 생성(create) 트랜잭션 내 단일 SQL 로 처리 — 효율적.
     */
    int insertFromSettleMaster(@Param("batchId") Long batchId,
                               @Param("settleMonth") String settleMonth);

    /**
     * VO 리스트 일괄 INSERT (수동 구성 또는 단위 테스트용).
     * insertFromSettleMaster 가 메인 경로이므로 보조 용도.
     */
    int insertBatch(@Param("list") List<PaymentBatchItemVO> list);

    /**
     * 배치 ID 기준 전체 items 조회 — 설계사명(agentName) 조인 포함.
     * PaymentBatchMapper.selectById 의 collection 에서도 참조.
     */
    List<PaymentBatchItemResp> selectByBatchId(@Param("batchId") Long batchId);

    /** 단건 조회 (updateInclude 전 DRAFT 검증 등 Service 용도) */
    PaymentBatchItemVO selectById(@Param("itemId") Long itemId);

    /**
     * 포함/제외 수정.
     * included=false 시 excludeReason 기록; included=true 로 복원 시 excludeReason=null 로 초기화.
     * 호출 후 PaymentBatchMapper.recalcTotals 반드시 실행.
     */
    int updateInclude(@Param("itemId") Long itemId,
                      @Param("included") Boolean included,
                      @Param("excludeReason") String excludeReason);
}
