/*
 * cl_holiday_batch.pgc - cl 휴일 마감 정책 배치 (주말 판정 + 태깅 + XA).
 *
 * 월 내 매입 발생 일자를 커서로 순회하며 요일을 판정, 주말(토/일) 거래일을
 * 리포트하고 해당 일자의 일마감에는 memo '|HOL' 태그를 남긴다.
 * 휴일 마감은 익영업일 이월 대상이라는 정책 표시. 전 구간 ONE global XA.
 * host 변수는 전용 카피북 cl_holiday_cpy.h 를 EXEC SQL INCLUDE 로 가져온다.
 * Usage: cl_holiday_batch [YYYY-MM]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>

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

    EXEC SQL INCLUDE cl_holiday_cpy;

    strncpy(hd_month, month, sizeof(hd_month)-1); hd_month[sizeof(hd_month)-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 DECLARE bhol CURSOR FOR
        SELECT to_char(biz_date,'YYYY-MM-DD'), to_char(biz_date,'D'), count(*)
        FROM purchase
        WHERE to_char(biz_date,'YYYY-MM') = :hd_month
        GROUP BY biz_date ORDER BY biz_date;
    EXEC SQL OPEN bhol;
    if (sqlca.sqlcode < 0) { fprintf(stderr, "OPEN FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }

    for (;;) {
        EXEC SQL FETCH bhol INTO :hd_day, :hd_dow, :hd_txn;
        if (sqlca.sqlcode == 100) break;
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE bhol; tpabort(0); return 1; }
        if (hd_dow[0] != '1' && hd_dow[0] != '7') continue; /* 평일은 정책 대상 아님 */
        weekend++;
        printf("    휴일거래 %s (요일코드 %s) %ld건 -> 익영업일 이월 대상\n", hd_day, hd_dow, hd_txn);
        EXEC SQL UPDATE cl_close_log
            SET memo = memo || '|HOL', updated_at = now()
            WHERE close_type = 'DAILY' AND period_key = :hd_day
              AND status <> 'X' AND memo NOT LIKE '%|HOL%';
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE bhol; tpabort(0); return 1; }
        EXEC SQL SELECT count(*) INTO :hd_marked FROM cl_close_log
            WHERE close_type = 'DAILY' AND period_key = :hd_day AND memo LIKE '%|HOL%';
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE bhol; tpabort(0); return 1; }
        tagged += hd_marked;
    }
    EXEC SQL CLOSE bhol;

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> cl_holiday_batch COMMIT: %s 휴일거래일=%ld HOL태그 마감=%ld\n", month, weekend, tagged);

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