/*
 * cm_reqage_batch.pgc - cm 파라미터 승인 대기 정체 감시 배치 (XA).
 *
 * 승인 워크플로 대기 키(REQ:%)의 대기 일수를 집계해 기준(3일)을 넘긴 정체
 * 요청 수와 최장 대기 일수를 구하고, 감시 결과(svc=REQAGE)를 적재한다.
 * 정체가 있으면 W 레벨로 남겨 승인 담당자 알림 대상으로 만든다.
 * Usage: cm_reqage_batch [YYYY-MM-DD]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>
#include "cm_reqage_batch.h"

int main(int argc, char **argv)
{
    const char *bizdate = (argc > 1) ? argv[1] : "2026-07-19";
    cm_reqage_rec_t rec;
    EXEC SQL BEGIN DECLARE SECTION;
    char h_bizdate[16], h_msg[112], h_lvl[4];
    long h_pend = 0, h_stale = 0, h_oldest = 0, h_days;
    EXEC SQL END DECLARE SECTION;

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

    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(sum(CASE WHEN (:h_bizdate::date - updated_at::date) > :h_days
                                      THEN 1 ELSE 0 END), 0),
                    coalesce(max(:h_bizdate::date - updated_at::date)::int, 0)
        INTO :h_pend, :h_stale, :h_oldest
        FROM cm_param WHERE param_key LIKE 'REQ:%';
    if (sqlca.sqlcode < 0) { tpabort(0); return 1; }

    rec.pending = h_pend;
    rec.stale = h_stale;
    rec.oldest_age = h_oldest;
    strcpy(h_lvl, rec.stale > 0 ? "W" : "I");
    snprintf(h_msg, sizeof(h_msg), "REQAGE pending=%ld stale=%ld oldest=%ldd",
             rec.pending, rec.stale, rec.oldest_age);

    EXEC SQL INSERT INTO cm_log (log_id, svc_name, log_level, msg, biz_date)
        VALUES (nextval('cm_log_seq'), 'REQAGE', :h_lvl, :h_msg, :h_bizdate);
    if (sqlca.sqlcode < 0) { fprintf(stderr, "cm_reqage_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> cm_reqage_batch COMMIT: 대기=%ld 정체=%ld 최장=%ld일\n",
           rec.pending, rec.stale, rec.oldest_age);

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