/*
 * cl_gapdays_batch.pgc - cl 마감 누락일 탐지/보정 배치 (NOT EXISTS 커서 + XA).
 *
 * 월 내 매입은 있으나 일마감이 전혀 없는 누락일을 커서로 찾아 리포트하고,
 * 각 누락일에 개시(O) placeholder 마감(memo 'GAP')을 만들어 마감 담당자의
 * 후속 처리 대기열에 올린다. 전 구간 ONE global XA.
 * host 변수는 전용 카피북 cl_gapdays_cpy.h 를 EXEC SQL INCLUDE 로 가져온다.
 * Usage: cl_gapdays_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 gaps = 0;

    EXEC SQL INCLUDE cl_gapdays_cpy;

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

    EXEC SQL DECLARE bgapd CURSOR FOR
        SELECT to_char(p.biz_date,'YYYY-MM-DD'), count(*) FROM purchase p
        WHERE to_char(p.biz_date,'YYYY-MM') = :gd_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'))
        GROUP BY p.biz_date ORDER BY p.biz_date;
    EXEC SQL OPEN bgapd;
    if (sqlca.sqlcode < 0) { fprintf(stderr, "OPEN FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }

    for (;;) {
        EXEC SQL FETCH bgapd INTO :gd_day, :gd_txn;
        if (sqlca.sqlcode == 100) break;
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE bgapd; tpabort(0); return 1; }
        EXEC SQL SELECT nextval('cl_close_seq') INTO :gd_cid;
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE bgapd; 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 (:gd_cid, 'DAILY', :gd_day, :gd_day, 'O', 0, 0, 'GAP');
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE bgapd; tpabort(0); return 1; }
        printf("    누락일 %s (매입 %ld건) -> placeholder cid=%ld 개시\n", gd_day, gd_txn, gd_cid);
        gaps++;
    }
    EXEC SQL CLOSE bgapd;

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> cl_gapdays_batch COMMIT: %s 누락일 %ld건 등록\n", month, gaps);

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