/*
 * mg_keyver_batch.pgc - mg 세대키 일괄 승급/세션키 재발급 배치 (2단계 갱신 + XA).
 *
 * KEYVER 카운터를 한 번 올린 뒤 UP 채널 전부의 세션키를 새 세대
 * "Kvvvv-<채널>" 로 재발급한다 (키 전환의 전 채널 일괄판).
 * Usage: mg_keyver_batch [YYYY-MM-DD]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>
#include "mg_keyver_batch.h"

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

    (void)bizdate;                             /* 키 승급은 영업일 무관 전 채널 대상 */

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

    /* 1단계: 세대키 번호 승급 */
    EXEC SQL UPDATE mg_seq SET seq_val = seq_val + 1, updated_at = now()
        WHERE seq_name = 'KEYVER'
        RETURNING seq_val INTO :h_kv;
    if (sqlca.sqlcode < 0 || sqlca.sqlerrd[2] == 0) {
        fprintf(stderr, "KEYVER 승급 FAIL [%d]\n", sqlca.sqlcode); tpabort(0); return 1;
    }
    rec.new_keyver = h_kv;

    /* 2단계: UP 채널 세션키 재발급 (채널명이 키 꼬리에 박혀 채널별로 달라짐) */
    sprintf(h_prefix, "K%04ld-", h_kv);
    EXEC SQL UPDATE mg_channel
        SET session_key = :h_prefix || channel, updated_at = now()
        WHERE status = 'UP';
    if (sqlca.sqlcode < 0) { fprintf(stderr, "세션키 재발급 FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
    rec.rekeyed = (long)sqlca.sqlerrd[2];

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> mg_keyver_batch COMMIT: 신규 키버전=%ld 재발급 채널=%ld개\n",
           rec.new_keyver, rec.rekeyed);

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