package com.ga.core.mapper.ledger;

import com.ga.core.vo.ledger.LedgerExcelVO;
import com.ga.core.vo.ledger.LedgerResp;
import com.ga.core.vo.ledger.LedgerSearchParam;
import com.ga.core.vo.ledger.LedgerVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.cursor.Cursor;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

@Mapper
public interface RecruitLedgerMapper {
    List<LedgerResp> selectList(LedgerSearchParam param);
    LedgerResp selectDetailById(@Param("ledgerId") Long ledgerId);
    LedgerVO selectById(@Param("ledgerId") Long ledgerId);
    Cursor<LedgerExcelVO> selectCursorForExcel(LedgerSearchParam param);
    int insert(LedgerVO vo);
    int batchInsert(@Param("list") List<LedgerVO> list);
    int update(LedgerVO vo);
    int deleteBySettleMonth(@Param("settleMonth") String settleMonth);

    /** 정산월 기준 설계사별 합계 (정산 마스터용) */
    List<Map<String, Object>> aggregateByAgent(@Param("settleMonth") String settleMonth);
    /** 정산월 합계 */
    BigDecimal sumByMonth(@Param("settleMonth") String settleMonth);
    /** 정산월 + 설계사 합계 */
    BigDecimal sumByAgentMonth(@Param("agentId") Long agentId,
                               @Param("settleMonth") String settleMonth);

    /** 정산월 + 설계사 + 보험종류 합계 (오버라이드 insurance_type_cond 적용용) */
    BigDecimal sumByAgentMonthAndType(@Param("agentId") Long agentId,
                                      @Param("settleMonth") String settleMonth,
                                      @Param("insuranceType") String insuranceType);

    /** 계약별 신계약 원장 수수료 합산 (1200%룰 누적 검증용) */
    BigDecimal sumByContract(@Param("contractId") Long contractId);

    /** 계약별 1차년도 수수료 합산 (1차년도 한도 검증용) */
    BigDecimal sumFirstYearByContract(@Param("contractId") Long contractId);
}
