/*
 * mg_dbio.h - mg 모듈 (전문게이트웨이) DB 접근 계층 (libmgdbio.a).
 * ECPG (EXEC SQL) functions compiled into a static library and linked into
 * mg_svr and the mg batches. They run on the caller's XA branch/connection
 * (no EXEC SQL CONNECT); sqlca is the shared per-thread ECPG SQLCA.
 * Return convention: 0 = ok, -1 = SQL error (caller may also inspect sqlca).
 */
#ifndef MG_DBIO_H
#define MG_DBIO_H

/* 채번 (STAN/전문 시퀀스) */
long mgdb_next_stan(void);
long mgdb_next_msg_id(void);
long mgdb_next_queue_id(void);
long mgdb_seq_bump(const char *name);        /* mg_seq 이름있는 카운터 +1 -> 새 값 */

/* 전문 로그 (mg_msg_log) */
int  mgdb_insert_msg(long msg_id, long stan, const char *mti, const char *channel,
                     const char *direction, const char *proc_code, const char *bitmap,
                     long amount, const char *pan, const char *rc, const char *raw,
                     const char *status, const char *bizdate);
int  mgdb_update_msg_rc(long msg_id, const char *rc, const char *status);
int  mgdb_get_msg_status(long msg_id, char *out /* >= 2 bytes */);
long mgdb_find_msg_by_stan(long stan);       /* msg_id 반환, 없으면 -1 */

/* 라우팅 (mg_route) */
int  mgdb_insert_route(long route_id, const char *channel, const char *mti,
                       const char *dest, long priority, const char *bizdate);
int  mgdb_lookup_route(const char *channel, const char *mti, char *dest_out /* >= 64 */);

/* 채널 (mg_channel) */
int  mgdb_get_channel_status(const char *channel, char *status_out /* >= 16 */);
int  mgdb_set_channel_status(const char *channel, const char *status);
int  mgdb_set_channel_session(const char *channel, const char *session_key, long stan);

/* 큐 (mg_queue) */
int  mgdb_enqueue(long queue_id, long stan, const char *channel, const char *mti,
                  const char *payload, const char *bizdate);
int  mgdb_set_queue_status(long queue_id, const char *status);


/* ----- expanded query/analytics dbio (each in its own mg_*_dbio.pgc) ----- */
long mgdb_msg_amount_sum(const char *bizdate);                           /* 당일 전문 금액 합계. */
long mgdb_queue_backlog(const char *status);                             /* 상태별 큐 적체 건수. */
long mgdb_msg_amount_spread(const char *bizdate);                        /* 전문 금액 최대-최소 스프레드. */
long mgdb_msg_err_ratio(const char *bizdate);                            /* 오류 전문 비율(bps). */
long mgdb_msg_chan_sum(const char *bizdate);                             /* 채널 그룹 금액 커서 누적. */
long mgdb_msg_avg_amount(const char *bizdate);                           /* 전문 건당 평균 금액. */
long mgdb_msg_inbound_amount(const char *bizdate);                       /* 수신(IN) 전문 금액 합계. */
long mgdb_queue_purge_sent(const char *bizdate);                         /* 송신완료(S) 큐 정리 삭제. */
long mgdb_queue_mark_stale(const char *bizdate);                         /* 대기(Q) 오래된 큐 실패(F) 전이. */
int mgdb_route_channel_exists(const char *key);                          /* 채널 라우팅 존재 여부. */
int mgdb_queue_payload(long id, char *out);                              /* 큐 ID 페이로드 조회. */
long mgdb_queue_weighted(const char *bizdate);                           /* STAN x 재시도수 가중 합. */
long mgdb_msg_peak_count(const char *bizdate);                           /* 최고 금액 전문 건수. */
long mgdb_msg_pan_like(const char *pat);                                 /* PAN 접두 패턴 전문 건수. */
long mgdb_msg_distinct_chan(const char *bizdate);                        /* 당일 고유 채널 수. */
long mgdb_msg_routed_amount(const char *bizdate);                        /* 라우팅 매칭 전문 금액(조인). */
long mgdb_msg_min_amount(const char *bizdate);                           /* 당일 최소 전문 금액. */
long mgdb_msg_big_pct(const char *bizdate);                              /* 고액 전문 비율(%). */
int mgdb_channel_is_up(const char *key);                                 /* 채널 UP 상태 여부. */
long mgdb_channel_bump_stan(const char *bizdate);                        /* 활동 채널 last_stan 증가. */
long mgdb_msg_insert_marker(const char *bizdate, long amount);           /* 마커 전문 채번 후 적재. */
long mgdb_queue_load(const char *bizdate);                               /* 큐 STAN+재시도 합산 부하지표. */
long mgdb_msg_positive_count(const char *bizdate);                       /* 금액>0 전문 건수(커서). */

#endif /* MG_DBIO_H */
