package com.ga.core.mapper.accounting;

import com.ga.core.vo.accounting.AccountBalanceSnapshotVO;
import com.ga.core.vo.accounting.AccountingCloseResp;
import com.ga.core.vo.accounting.AccountingCloseSearchParam;
import com.ga.core.vo.accounting.AccountingCloseVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

@Mapper
public interface AccountingCloseMapper {

    /** 결산 목록 */
    List<AccountingCloseResp> selectList(AccountingCloseSearchParam param);

    /** 결산 단건 상세 */
    AccountingCloseResp selectDetailById(@Param("closeId") Long closeId);

    /** 결산 헤더 INSERT (DRAFT 상태) */
    int insert(AccountingCloseVO vo);

    /**
     * 마감 처리.
     *  - close_status = CLOSED, closed_at = now(), closed_by, journal_count/total_debit/total_credit UPDATE
     */
    int updateClose(@Param("closeId") Long closeId,
                    @Param("journalCount") int journalCount,
                    @Param("totalDebit") BigDecimal totalDebit,
                    @Param("totalCredit") BigDecimal totalCredit,
                    @Param("closedBy") Long closedBy);

    /**
     * 재오픈 처리.
     *  - close_status = REOPENED, reopened_at = now(), reopened_by, reopen_reason UPDATE
     */
    int updateReopen(@Param("closeId") Long closeId,
                     @Param("reopenedBy") Long reopenedBy,
                     @Param("reopenReason") String reopenReason);

    /**
     * 마감 대상 미전기 분개 엔트리 ID 목록 조회.
     *  - 월결산: entry_date가 YYYY-MM 범위 & journal_no IS NULL
     *  - 분기/연결산: 해당 분기/연도 범위
     */
    List<Long> selectUnpostedEntryIds(@Param("closeType") String closeType,
                                       @Param("closePeriod") String closePeriod);

    /** 결산 시점 잔액 스냅샷 일괄 INSERT (debit/credit 합계 + balance) */
    int insertBalanceSnapshot(@Param("list") List<AccountBalanceSnapshotVO> list);

    /**
     * 결산 시점 계정과목별 차변/대변 합계 집계.
     * contract_accounting_entry 에서 journal_no가 채번된 분개를 account_code 별로 SUM.
     */
    List<AccountBalanceSnapshotVO> selectBalanceAggregate(@Param("journalPrefix") String journalPrefix);

    /** 단순 잔액 스냅샷 목록 (closeId 기준) */
    List<AccountBalanceSnapshotVO> selectSnapshotByCloseId(@Param("closeId") Long closeId);
}
