/*
 * st_ratesim_batch.pgc - 요율 시뮬레이션 배치 (XA 배치).
 * 당일 매입 총액을 기준으로 요율표(st_fee_rate)의 모든 구간 요율을 커서로
 * 순회하며 구간별 예상 수수료를 시뮬레이션 출력한다 (조회 전용).
 * ATMI 클라이언트: tpinit/tpopen 으로 ECPG XA RM 를 열고 tpbegin 으로 ONE global tx
 * 를 시작, EXEC SQL 수행 후 tpcommit 이 XA 2PC 를 구동. 사용법: st_ratesim_batch [YYYY-MM-DD]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>
#include "st_dbio.h"
#include "st_ratesim_batch.h"

int main(int argc, char **argv)
{
    const char *bizdate = (argc > 1) ? argv[1] : "2026-07-19";
    st_ratesim_rec_t rec;
    memset(&rec, 0, sizeof(rec));
    EXEC SQL BEGIN DECLARE SECTION;
    char h_bizdate[16], h_type[16];
    long h_gross, h_min, h_bps;
    EXEC SQL END DECLARE SECTION;

    strncpy(h_bizdate, bizdate, sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;

    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 SELECT coalesce(sum(amount),0) INTO :h_gross FROM purchase WHERE biz_date = :h_bizdate;
    if (sqlca.sqlcode < 0) { fprintf(stderr, "GROSS FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
    rec.day_gross = h_gross;

    EXEC SQL DECLARE ratesim_bc CURSOR FOR
        SELECT fee_type, band_min, rate_bps FROM st_fee_rate ORDER BY fee_type, band_min;
    EXEC SQL OPEN ratesim_bc;
    if (sqlca.sqlcode < 0) { fprintf(stderr, "OPEN FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
    for (;;) {
        EXEC SQL FETCH ratesim_bc INTO :h_type, :h_min, :h_bps;
        if (sqlca.sqlcode == 100) break;
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE ratesim_bc; tpabort(0); return 1; }
        {
            long sim = h_gross * h_bps / 10000;    /* 이 구간 요율이 전액 적용됐을 때 */
            rec.bands++;
            rec.projected += sim;
            printf("    SIM %-8s band_min=%ld bps=%ld -> fee=%ld\n", h_type, h_min, h_bps, sim);
        }
    }
    EXEC SQL CLOSE ratesim_bc;

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> %s COMMIT: bizdate=%s gross=%ld bands=%ld projected_total=%ld\n",
           ST_RATESIM_TAG, bizdate, rec.day_gross, rec.bands, rec.projected);

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