/*
 * cm_rerunpick_batch.pgc - cm 배치 재실행 요청 처리 배치 (XA).
 *
 * CM_BATRERUN_REQ 가 남긴 기준일 RERUN 요청(W 레벨)을 세고, 요청 전체를
 * 접수 완료(I 레벨) 상태로 UPDATE 전이한 뒤 처리 요약 로그(svc=RERUNPK)를
 * 적재한다. W->I 전이 건수가 곧 이번 사이클에 집어간 요청 수다.
 * Usage: cm_rerunpick_batch [YYYY-MM-DD]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>
#include "cm_rerunpick_batch.h"

int main(int argc, char **argv)
{
    const char *bizdate = (argc > 1) ? argv[1] : "2026-07-19";
    cm_rerunpick_rec_t rec = { 0, 0, 0 };
    EXEC SQL BEGIN DECLARE SECTION;
    char h_bizdate[16], h_msg[112];
    long h_pend = 0, h_last = 0;
    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 count(*), coalesce(max(log_id), 0) INTO :h_pend, :h_last
        FROM cm_log
        WHERE svc_name = 'RERUN' AND log_level = 'W' AND biz_date = :h_bizdate;
    if (sqlca.sqlcode < 0) { tpabort(0); return 1; }
    rec.pending = h_pend;
    rec.last_id = h_last;

    if (rec.pending > 0) {
        EXEC SQL UPDATE cm_log SET log_level = 'I'
            WHERE svc_name = 'RERUN' AND log_level = 'W' AND biz_date = :h_bizdate;
        if (sqlca.sqlcode < 0) { fprintf(stderr, "cm_rerunpick_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
        rec.picked = (long)sqlca.sqlerrd[2];
    }

    snprintf(h_msg, sizeof(h_msg), "RERUNPK pending=%ld picked=%ld last=%ld",
             rec.pending, rec.picked, rec.last_id);
    EXEC SQL INSERT INTO cm_log (log_id, svc_name, log_level, msg, biz_date)
        VALUES (nextval('cm_log_seq'), 'RERUNPK', 'I', :h_msg, :h_bizdate);
    if (sqlca.sqlcode < 0) { tpabort(0); return 1; }

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> cm_rerunpick_batch COMMIT: 요청=%ld 접수=%ld 마지막ID=%ld\n",
           rec.pending, rec.picked, rec.last_id);

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