/*
 * mg_timeout_batch.pgc - mg 응답지연 전문 일괄 타임아웃 배치 (XA 단일 갱신 배치).
 *
 * mg_seq(TMOUTSEC) 임계초를 읽어, 그 시간을 넘긴 수신(R) 상태 전문을
 * rc=68/N 으로 한 문장에 전이시킨다 (MG_TIMEOUT 스윕의 일배치 대량판).
 * Usage: mg_timeout_batch [YYYY-MM-DD]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>
#include "mg_timeout_batch.h"

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

    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; }

    h_sec = 60;                                /* 설정 없으면 60초 기본 */
    EXEC SQL SELECT seq_val INTO :h_sec FROM mg_seq WHERE seq_name = 'TMOUTSEC';
    if (sqlca.sqlcode < 0) { fprintf(stderr, "TMOUTSEC 조회 FAIL [%d]\n", sqlca.sqlcode); tpabort(0); return 1; }
    if (h_sec <= 0) h_sec = 60;
    rec.threshold_sec = h_sec;

    EXEC SQL UPDATE mg_msg_log
        SET rc = '68', status = 'N'
        WHERE biz_date = :h_bizdate AND status = 'R'
          AND created_at < now() - (:h_sec * interval '1 second');
    if (sqlca.sqlcode < 0) { fprintf(stderr, "타임아웃 전이 FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
    rec.expired = (long)sqlca.sqlerrd[2];

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> mg_timeout_batch COMMIT: bizdate=%s 임계=%ld초 만료전이=%ld건\n",
           bizdate, rec.threshold_sec, rec.expired);

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