package com.ga.core.mapper.settle;

import com.ga.core.vo.settle.PaymentBatchResp;
import com.ga.core.vo.settle.PaymentBatchSearchParam;
import com.ga.core.vo.settle.PaymentBatchVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * payment_batch Mapper — 지급대상 배치 마스터 (V115)
 */
@Mapper
public interface PaymentBatchMapper {

    /**
     * 배치 생성 (DRAFT 상태로 INSERT).
     * useGeneratedKeys=true 로 vo.batchId 에 채번된 PK 주입.
     */
    int insert(PaymentBatchVO vo);

    /**
     * 배치 목록 조회 — settleMonth / status 필터, PageHelper 호환.
     * 상태명(statusName) 포함, items 는 null.
     */
    List<PaymentBatchResp> selectList(PaymentBatchSearchParam param);

    /**
     * 배치 단건 상세 조회.
     * ResultMap 의 collection 으로 items(PaymentBatchItemResp) 자동 populate.
     */
    PaymentBatchResp selectById(@Param("batchId") Long batchId);

    /**
     * 포함 건수 / 포함 payable 합계 재집계 UPDATE.
     *   total_count   = COUNT(*)  WHERE batch_id=? AND included=true
     *   total_payable = SUM(payable_amount) WHERE batch_id=? AND included=true
     * updateItem 후 반드시 호출.
     */
    int recalcTotals(@Param("batchId") Long batchId);

    /**
     * 배치 상태 변경 (DRAFT→FINALIZED / DRAFT→CANCELLED 등).
     * FINALIZED 시 finalized_at=now(), finalized_by=userId 도 함께 기록.
     */
    int updateStatus(@Param("batchId") Long batchId,
                     @Param("status") String status,
                     @Param("userId") Long userId);

    /** 페이징 count 쿼리 */
    int countByCondition(PaymentBatchSearchParam param);
}
