/*
 * mm_mcc_flag_batch.pgc - 고위험 업종 가맹점 플래그 배치 (JOIN 커서 + XA).
 *
 * 리스크 등급이 기준 이상인 MCC를 쓰는 활성 가맹점에 MCC_FLAG 이력을 남겨
 * 모니터링 대상으로 표시한다. ONE global XA transaction.
 * host 변수는 mm_mcc_flag_cpy.h 를 EXEC SQL INCLUDE.
 * Usage: mm_mcc_flag_batch [MINRISK=4]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>
#include "mm_dbio.h"

int main(int argc, char **argv)
{
    char memo[48];
    EXEC SQL INCLUDE mm_mcc_flag_cpy;
    b_flagged = 0;
    b_minrisk = (argc > 1) ? atol(argv[1]) : 4;
    if (b_minrisk < 1 || b_minrisk > 5) b_minrisk = 4;

    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 mfl CURSOR FOR
        SELECT me.merchant_id, me.mcc, m.risk_level
        FROM mm_merchant_ext me JOIN mm_mcc m ON m.mcc = me.mcc
        WHERE me.status = 'ACTIVE' AND m.risk_level >= :b_minrisk
        ORDER BY me.merchant_id;
    EXEC SQL OPEN mfl;
    if (sqlca.sqlcode < 0) { fprintf(stderr, "OPEN FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }

    for (;;) {
        EXEC SQL FETCH mfl INTO :b_merch, :b_mcc, :b_risk;
        if (sqlca.sqlcode == 100) break;
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE mfl; tpabort(0); return 1; }
        snprintf(memo, sizeof(memo), "MCC %s 위험 %ld", b_mcc, b_risk);
        if (mmdb_insert_merch_hist(b_merch, "MCC_FLAG", "", b_mcc, memo) < 0) {
            EXEC SQL CLOSE mfl; tpabort(0); return 1;
        }
        b_flagged++;
    }
    EXEC SQL CLOSE mfl;

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> mm_mcc_flag_batch COMMIT: 기준위험>=%ld 플래그=%ld건\n", b_minrisk, b_flagged);

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