package com.ga.core.mapper.accounting;

import com.ga.core.vo.accounting.ContractAccountingEntryResp;
import com.ga.core.vo.accounting.ContractAccountingEntrySearchParam;
import com.ga.core.vo.accounting.ContractAccountingEntryVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface ContractAccountingEntryMapper {

    /** 목록 조회 — contractId / paymentId / entryDate 범위 / unpostedOnly 조건 */
    List<ContractAccountingEntryResp> selectList(ContractAccountingEntrySearchParam param);

    /** 단건 상세 */
    ContractAccountingEntryResp selectDetailById(@Param("entryId") Long entryId);

    /** 배치 step용: 정산월 기준 분개 대상 원장 조회 (recruit+maintain ledger UNION) */
    List<ContractAccountingEntryVO> selectBySettleMonth(@Param("settleMonth") String settleMonth);

    /**
     * 배치 step용: 정산월의 미전기(journal_no IS NULL) 분개 삭제 — 재생성 멱등성 확보.
     * 마감 채번된 분개는 보존.
     */
    int deleteUnpostedBySettleMonth(@Param("settleMonth") String settleMonth);

    /**
     * 분개 엔트리 일괄 INSERT.
     * 회계 자동분개 배치 step에서 호출.
     */
    int insertBatch(@Param("list") List<ContractAccountingEntryVO> list);

    /**
     * 미전기 엔트리 마감 처리 — journalNo 채번 후 UPDATE.
     * @param ids       마감할 entry_id 목록
     * @param journalNo 채번된 분개장 번호
     */
    int closeJournal(@Param("ids") List<Long> ids,
                     @Param("journalNo") String journalNo);
}
