/*
 * cm_codeaudit_batch.pgc - cm 폐기 코드 감사 배치 (XA 단일 글로벌 트랜잭션).
 *
 * 공통코드 전체/폐기(use_yn='N') 건수를 집계해 폐기 비율(bps)을 계산하고,
 * 감사 결과 한 건을 cm_log (svc=CODEAUD) 에 적재한다. 폐기 비율이 절반을
 * 넘으면 W 레벨로 남겨 운영자가 코드 정비를 하도록 알린다.
 * Usage: cm_codeaudit_batch [YYYY-MM-DD]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>
#include "cm_codeaudit_batch.h"

int main(int argc, char **argv)
{
    const char *bizdate = (argc > 1) ? argv[1] : "2026-07-19";
    cm_codeaudit_rec_t rec;
    EXEC SQL BEGIN DECLARE SECTION;
    char h_bizdate[16], h_msg[128], h_lvl[4];
    long h_total = 0, h_dis = 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(sum(CASE WHEN use_yn = 'N' THEN 1 ELSE 0 END), 0)
        INTO :h_total, :h_dis FROM cm_code;
    if (sqlca.sqlcode < 0) { tpabort(0); return 1; }

    rec.total = h_total;
    rec.disabled = h_dis;
    rec.ratio_bps = (h_total > 0) ? h_dis * 10000L / h_total : 0;
    strcpy(h_lvl, rec.ratio_bps > 5000 ? "W" : "I");
    snprintf(h_msg, sizeof(h_msg), "CODE AUDIT total=%ld disabled=%ld ratio=%ldbps",
             rec.total, rec.disabled, rec.ratio_bps);

    EXEC SQL INSERT INTO cm_log (log_id, svc_name, log_level, msg, biz_date)
        VALUES (nextval('cm_log_seq'), 'CODEAUD', :h_lvl, :h_msg, :h_bizdate);
    if (sqlca.sqlcode < 0) { fprintf(stderr, "cm_codeaudit_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_codeaudit_batch COMMIT: bizdate=%s 전체=%ld 폐기=%ld (%ldbps)\n",
           bizdate, rec.total, rec.disabled, rec.ratio_bps);

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