/*
 * py_feewaive_batch.pgc - py 소액 지급 수수료 일괄 면제 배치 (INSERT..SELECT + UPDATE, XA).
 *
 * 당일 요청(R)건 중 지급액이 임계 이하인 소액건의 수수료를 전액 면제:
 * 먼저 INSERT..SELECT 로 py_adjust 증적을 뜨고, 이어서 fee=0/net=amount 로
 * 일괄 갱신한다 (증적 건수와 갱신 건수 일치 검증 출력).
 * host 변수는 전용 카피북 py_feewaive_cpy.h 를 EXEC SQL INCLUDE.
 * Usage: py_feewaive_batch [YYYY-MM-DD] [THRESHOLD]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>

int main(int argc, char **argv)
{
    const char *bizdate = (argc > 1) ? argv[1] : "2026-07-19";

    EXEC SQL INCLUDE py_feewaive_cpy;

    strncpy(c_bizdate, bizdate, sizeof(c_bizdate)-1); c_bizdate[sizeof(c_bizdate)-1] = 0;
    c_thr = (argc > 2) ? atol(argv[2]) : 30000;   /* 기본 소액 기준 3만원 */

    if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
    if (tpopen() < 0)     { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
    if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }

    EXEC SQL INSERT INTO py_adjust (adj_id, payout_id, delta, reason, biz_date)
        SELECT nextval('py_adjust_seq'), payout_id, fee, '소액수수료면제', biz_date
          FROM py_payout
         WHERE biz_date = :c_bizdate AND status = 'R' AND fee > 0 AND amount <= :c_thr;
    if (sqlca.sqlcode < 0) { fprintf(stderr, "INSERT FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
    c_logged = sqlca.sqlerrd[2];

    EXEC SQL UPDATE py_payout SET fee = 0, net = amount, updated_at = now()
        WHERE biz_date = :c_bizdate AND status = 'R' AND fee > 0 AND amount <= :c_thr;
    if (sqlca.sqlcode < 0) { fprintf(stderr, "UPDATE FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
    c_waived = sqlca.sqlerrd[2];

    if (c_logged != c_waived) {
        fprintf(stderr, "py_feewaive_batch 증적/갱신 불일치 %ld != %ld -> ROLLBACK\n", c_logged, c_waived);
        tpabort(0); return 1;
    }
    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> py_feewaive_batch COMMIT: bizdate=%s 기준=%ld원 면제=%ld건(증적 %ld)\n",
           bizdate, c_thr, c_waived, c_logged);

    tpclose(); tpterm();
    return 0;
}
