/*
 * cm_holyear_batch.pgc - cm 연간 휴일 통계 배치 (XA).
 *
 * 기준일이 속한 연도의 휴일을 국가별로 커서 집계해 국가 수/휴일 수/주말겹침
 * 수를 누적한다. 국가별 휴일 수는 svc=HOLYEAR 로그로 각 행을 남기고, 마지막에
 * 총계 행을 추가한다. 캘린더 편성 리포트에 쓰인다.
 * Usage: cm_holyear_batch [YYYY-MM-DD]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>
#include "cm_holyear_batch.h"

int main(int argc, char **argv)
{
    const char *bizdate = (argc > 1) ? argv[1] : "2026-07-19";
    cm_holyear_rec_t rec = { 0, 0, 0 };
    EXEC SQL BEGIN DECLARE SECTION;
    char h_bizdate[16], h_nation[8], h_msg[112];
    long h_year, h_cnt, h_wknd;
    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 extract(year FROM :h_bizdate::date) INTO :h_year;
    if (sqlca.sqlcode < 0) { tpabort(0); return 1; }

    EXEC SQL DECLARE cur_hy CURSOR FOR
        SELECT nation, count(*),
               coalesce(sum(CASE WHEN extract(dow FROM holi_date) IN (0,6) THEN 1 ELSE 0 END), 0)
        FROM cm_holiday WHERE extract(year FROM holi_date) = :h_year
        GROUP BY nation ORDER BY nation;
    EXEC SQL OPEN cur_hy;
    if (sqlca.sqlcode < 0) { tpabort(0); return 1; }

    for (;;) {
        EXEC SQL FETCH cur_hy INTO :h_nation, :h_cnt, :h_wknd;
        if (sqlca.sqlcode == 100) break;
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE cur_hy; tpabort(0); return 1; }
        rec.nations++;
        rec.holidays += h_cnt;
        rec.weekend += h_wknd;
        snprintf(h_msg, sizeof(h_msg), "HOLYEAR %ld %s cnt=%ld wknd=%ld",
                 h_year, h_nation, h_cnt, h_wknd);
        EXEC SQL INSERT INTO cm_log (log_id, svc_name, log_level, msg, biz_date)
            VALUES (nextval('cm_log_seq'), 'HOLYEAR', 'I', :h_msg, :h_bizdate);
        if (sqlca.sqlcode < 0) { EXEC SQL CLOSE cur_hy; tpabort(0); return 1; }
    }
    EXEC SQL CLOSE cur_hy;

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> cm_holyear_batch COMMIT: 국가=%ld 휴일=%ld 주말겹침=%ld\n",
           rec.nations, rec.holidays, rec.weekend);

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