/*
 * cl_audit_batch.pgc - cl 마감 이력 감사 배치 (4개 감사항목 집계 + XA).
 *
 * 기간 프리픽스에 대해 (1)재개시 흔적(REOPEN memo) (2)승인/잠금인데 잠금행
 * 없음 (3)잠금시각 이후 수정 흔적 (4)사유 없는 취소(X) 4개 감사항목을
 * 각각 단건 집계 SELECT 로 산출해 감사 리포트를 출력한다 (조회 전용).
 * host 변수는 전용 카피북 cl_audit_cpy.h 를 EXEC SQL INCLUDE 로 가져온다.
 * Usage: cl_audit_batch [YYYY-MM]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>

int main(int argc, char **argv)
{
    const char *prefix = (argc > 1) ? argv[1] : "2026-07";
    long findings = 0;

    EXEC SQL INCLUDE cl_audit_cpy;

    strncpy(au_prefix, prefix, sizeof(au_prefix)-1); au_prefix[sizeof(au_prefix)-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; }

    printf(">>> cl_audit_batch %s 마감 이력 감사\n", prefix);

    EXEC SQL SELECT count(*) INTO :au_reopened FROM cl_close_log
        WHERE period_key LIKE :au_prefix || '%' AND memo LIKE 'REOPEN:%';
    if (sqlca.sqlcode < 0) { tpabort(0); return 1; }
    printf("    [감사1] 재개시 이력          : %ld건\n", au_reopened);

    EXEC SQL SELECT count(*) INTO :au_nolockrow FROM cl_close_log c
        WHERE c.period_key LIKE :au_prefix || '%' AND c.status IN ('A','L')
          AND NOT EXISTS (SELECT 1 FROM cl_period_lock l
                          WHERE l.period_key = c.period_key AND l.locked = true);
    if (sqlca.sqlcode < 0) { tpabort(0); return 1; }
    printf("    [감사2] 승인/잠금인데 잠금행 없음: %ld건\n", au_nolockrow);

    EXEC SQL SELECT count(*) INTO :au_tampered
        FROM cl_close_log c, cl_period_lock l
        WHERE c.period_key LIKE :au_prefix || '%'
          AND l.period_key = c.period_key AND l.locked = true
          AND c.updated_at > l.locked_at;
    if (sqlca.sqlcode < 0) { tpabort(0); return 1; }
    printf("    [감사3] 잠금 후 수정 흔적    : %ld건\n", au_tampered);

    EXEC SQL SELECT count(*) INTO :au_emptycxl FROM cl_close_log
        WHERE period_key LIKE :au_prefix || '%' AND status = 'X'
          AND (memo = '' OR memo IS NULL);
    if (sqlca.sqlcode < 0) { tpabort(0); return 1; }
    printf("    [감사4] 사유 없는 취소       : %ld건\n", au_emptycxl);

    findings = au_nolockrow + au_tampered + au_emptycxl;

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> cl_audit_batch 결과: 이상항목 합계 %ld건 -> %s\n",
           findings, findings ? "감사 소명 필요" : "적합");

    tpclose(); tpterm();
    return findings ? 2 : 0;
}
