<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ga.core.mapper.commission.ClawbackRecoveryMapper">

    <resultMap id="VOMap" type="com.ga.core.vo.commission.ClawbackRecoveryVO"/>

    <!-- Resp resultMap — ClawbackRecoveryResp 는 VO와 동일 컬럼 구성 -->
    <resultMap id="RespMap" type="com.ga.core.vo.commission.ClawbackRecoveryResp"/>

    <!-- 회수 이력 단건 INSERT — useGeneratedKeys 로 recoveryId 반환 -->
    <insert id="insertOne" useGeneratedKeys="true" keyProperty="recoveryId">
        INSERT INTO clawback_recovery
            (receivable_id, settle_month, recovered_amount, created_at)
        VALUES
            (#{receivableId}, #{settleMonth}, #{recoveredAmount}, NOW())
    </insert>

    <!-- 채권 ID 기준 전체 회수 이력 조회 — 상세 Resp collection 용도 -->
    <select id="selectByReceivableId" resultMap="RespMap">
        SELECT recovery_id, receivable_id, settle_month, recovered_amount, created_at
          FROM clawback_recovery
         WHERE receivable_id = #{receivableId}
         ORDER BY settle_month ASC, recovery_id ASC
    </select>

    <!--
        채권 + 정산월 기준 회수 이력 조회.
        배치 reverse 단계에서 복원할 금액 합산 시 사용.
    -->
    <select id="selectByReceivableMonth" resultMap="VOMap">
        SELECT recovery_id, receivable_id, settle_month, recovered_amount, created_at
          FROM clawback_recovery
         WHERE receivable_id = #{receivableId}
           AND settle_month   = #{settleMonth}
         ORDER BY recovery_id ASC
    </select>

    <!--
        특정 정산월 전체 회수 이력 조회.
        배치 applyCarryoverAndRecovery reverse 단계 1:
        해당 월 회수 건 전체를 조회 → receivable.balance 복원 → 이 메서드로 조회한 결과를 순회.
    -->
    <select id="selectByMonth" resultMap="VOMap">
        SELECT recovery_id, receivable_id, settle_month, recovered_amount, created_at
          FROM clawback_recovery
         WHERE settle_month = #{settleMonth}
         ORDER BY receivable_id ASC, recovery_id ASC
    </select>

    <!--
        채권 + 정산월 기준 회수 이력 삭제.
        배치 단일 채권 역전 시 사용.
    -->
    <delete id="deleteByReceivableMonth">
        DELETE FROM clawback_recovery
         WHERE receivable_id = #{receivableId}
           AND settle_month   = #{settleMonth}
    </delete>

    <!--
        정산월 단위 전체 회수 이력 삭제.
        배치 월 전체 재정산(reverse) 시 사용. deleteByMonth 후 채권 balance 복원 필요.
    -->
    <delete id="deleteByMonth">
        DELETE FROM clawback_recovery
         WHERE settle_month = #{settleMonth}
    </delete>

</mapper>
