/*
 * cl_provclose_batch.pgc - cl 가마감 일괄 생성 배치 (누락일 커서 + XA).
 *
 * 월(YYYY-MM) 내 매입은 있으나 어떤 일마감도 없는 일자를 커서로 찾아
 * 일자마다 status O + memo 'PROV' 가마감을 집계와 함께 생성한다.
 * 본마감 전 임시 스냅샷 성격. 전 구간 ONE global XA.
 * host 변수는 전용 카피북 cl_provclose_cpy.h 를 EXEC SQL INCLUDE 로 가져온다.
 * Usage: cl_provclose_batch [YYYY-MM]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>

int main(int argc, char **argv)
{
    const char *month = (argc > 1) ? argv[1] : "2026-07";
    long made = 0;

    EXEC SQL INCLUDE cl_provclose_cpy;

    strncpy(pv_month, month, sizeof(pv_month)-1); pv_month[sizeof(pv_month)-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(90, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }

    EXEC SQL DECLARE bprov CURSOR FOR
        SELECT DISTINCT to_char(p.biz_date,'YYYY-MM-DD') FROM purchase p
        WHERE to_char(p.biz_date,'YYYY-MM') = :pv_month
          AND NOT EXISTS (SELECT 1 FROM cl_close_log c
                          WHERE c.close_type = 'DAILY'
                            AND c.period_key = to_char(p.biz_date,'YYYY-MM-DD')
                            AND c.status <> 'X')
        ORDER BY 1;
    EXEC SQL OPEN bprov;
    if (sqlca.sqlcode < 0) { fprintf(stderr, "OPEN FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }

    for (;;) {
        EXEC SQL FETCH bprov INTO :pv_day;
        if (sqlca.sqlcode == 100) break;
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE bprov; tpabort(0); return 1; }
        EXEC SQL SELECT count(*), coalesce(sum(amount),0) INTO :pv_cnt, :pv_amt
            FROM purchase WHERE biz_date = :pv_day AND status IN ('M','S');
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE bprov; tpabort(0); return 1; }
        EXEC SQL SELECT nextval('cl_close_seq') INTO :pv_cid;
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE bprov; tpabort(0); return 1; }
        EXEC SQL INSERT INTO cl_close_log
            (close_id, close_type, period_key, biz_date, status, txn_count, total_amount, memo)
            VALUES (:pv_cid, 'DAILY', :pv_day, :pv_day, 'O', :pv_cnt, :pv_amt, 'PROV');
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE bprov; tpabort(0); return 1; }
        printf("    가마감 %s cid=%ld cnt=%ld\n", pv_day, pv_cid, pv_cnt);
        made++;
    }
    EXEC SQL CLOSE bprov;

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> cl_provclose_batch COMMIT: %s 가마감 %ld건 생성\n", month, made);

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