/*
 * st_deposit_batch.pgc - 보증금 차감 배치 (조건부 집합 UPDATE + 총액 조정 + XA).
 * 차감 후에도 지급액이 남는(net_amount > cut) SCHEDULED 지급 전체에서 보증금
 * 단위를 일괄 차감하고, 총 차감액을 음수 조정 1건으로 기록한다.
 * 사용법: st_deposit_batch [YYYY-MM-DD] [cut]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>
#include "st_dbio.h"
#include "st_deposit_batch.h"

int main(int argc, char **argv)
{
    const char *bizdate = (argc > 1) ? argv[1] : "2026-07-19";
    st_deposit_rec_t rec;
    rec.cut_each = (argc > 2) ? atol(argv[2]) : ST_DEPOSIT_DEF_CUT;
    rec.cut_rows = 0;

    EXEC SQL BEGIN DECLARE SECTION;
    char h_bizdate[16];
    long h_cut;
    EXEC SQL END DECLARE SECTION;
    strncpy(h_bizdate, bizdate, sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
    h_cut = rec.cut_each;

    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 UPDATE st_payment SET net_amount = net_amount - :h_cut
        WHERE biz_date = :h_bizdate AND status = 'SCHEDULED' AND net_amount > :h_cut;
    if (sqlca.sqlcode < 0) { fprintf(stderr, "CUT FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
    rec.cut_rows = (long) sqlca.sqlerrd[2];

    if (rec.cut_rows > 0) {
        if (stdb_insert_adjust(0, 0, -(rec.cut_each * rec.cut_rows), "DEPOSIT", bizdate) < 0) { tpabort(0); return 1; }
    }

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> %s COMMIT: bizdate=%s cut_each=%ld cut_rows=%ld total=%ld\n",
           ST_DEPOSIT_TAG, bizdate, rec.cut_each, rec.cut_rows, rec.cut_each * rec.cut_rows);

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