/*
 * cl_tenday_batch.pgc - cl 순(10일) 마감 배치 (상/중/하순 집계 + TENDAY 마감 + XA).
 *
 * 기준일이 속한 순(1~10/11~20/21~말) 구간의 매입을 집계해 TENDAY 마감이력을 기록한다.
 * host 변수는 전용 카피북 cl_tenday_cpy.h 를 EXEC SQL INCLUDE 로 가져온다.
 * Usage: cl_tenday_batch [YYYY-MM-DD]
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atmi.h>
#include "cl_dbio.h"

int main(int argc, char **argv)
{
    const char *bizdate = (argc > 1) ? argv[1] : "2026-07-19";
    long cid, dec;
    char period[24], memo[32];

    EXEC SQL INCLUDE cl_tenday_cpy;

    strncpy(td_bizdate, bizdate, sizeof(td_bizdate)-1); td_bizdate[sizeof(td_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(day from :td_bizdate::date)::int,
                    to_char(:td_bizdate::date, 'YYYY-MM') INTO :td_day, :td_ym;
    if (sqlca.sqlcode < 0) { tpabort(0); return 1; }
    dec = (td_day <= 10) ? 1 : (td_day <= 20 ? 2 : 3);
    td_lo = (dec - 1) * 10 + 1;
    td_hi = (dec == 3) ? 31 : dec * 10;

    EXEC SQL SELECT count(*), coalesce(sum(amount),0) INTO :td_cnt, :td_amt
        FROM purchase WHERE to_char(biz_date,'YYYY-MM') = :td_ym
          AND extract(day from biz_date) BETWEEN :td_lo AND :td_hi;
    if (sqlca.sqlcode < 0) { tpabort(0); return 1; }

    snprintf(period, sizeof(period), "%s-T%ld", td_ym, dec);
    snprintf(memo, sizeof(memo), "순마감(배치):%ld순", dec);
    cid = cldb_next_close_id();
    if (cid < 0) { tpabort(0); return 1; }
    if (cldb_insert_close(cid, "TENDAY", period, bizdate, "C", td_cnt, td_amt, memo) < 0) {
        tpabort(0); return 1;
    }

    if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
    printf(">>> cl_tenday_batch COMMIT: %s %ld순 cid=%ld 건수=%ld\n", td_ym, dec, cid, td_cnt);

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