/*
 * MM_TERMINAL_INQ.pgc - mm 모듈 서비스 MM_TERMINAL_INQ (one service = one file).
 * 기능: 단말 조회.
 * 기존 인라인 mm_svr.pgc에서 분리; caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음).
 * mm_svr가 tpsvrinit에서 이 서비스를 tpadvertise 한다.
 */
#include "MM_TERMINAL_INQ.h"

void MM_TERMINAL_INQ(TPSVCINFO *p)
{
    UBFH *b = (UBFH *)p->data;
    char term[32];
    EXEC SQL BEGIN DECLARE SECTION;
    char h_term[32], h_merch[64], h_status[16];
    EXEC SQL END DECLARE SECTION;
    gets_(b, T_STR5, term, sizeof(term));
    strncpy(h_term, term, sizeof(h_term)-1); h_term[sizeof(h_term)-1] = 0;
    EXEC SQL SELECT merchant_id, status INTO :h_merch, :h_status
        FROM mm_terminal WHERE terminal_id = :h_term;
    if (sqlca.sqlcode < 0 || sqlca.sqlcode == 100) FAIL(b);
    Bchg(b, T_MERCHANT, 0, h_merch, 0L);
    Bchg(b, T_STATUS, 0, h_status, 0L);

    /* ====================================================================
     * [심화 후처리] MM_TERMINAL_INQ - 단말 마스터 정합/감사/집계 확장부 (mm 단말)
     * 단말-가맹점 소속 정합성과 가동 현황을 재점검하고 감사 로그를 남긴다.
     * ==================================================================== */
    {
        EXEC SQL BEGIN DECLARE SECTION;
        char  zx_svc[24], zx_key[64], zx_pmerch[64], zx_pstat[16], zx_msg[192];
        long  zx_logid, zx_n1, zx_n2, zx_n3, zx_bps, zx_orphan, zx_act;
        EXEC SQL END DECLARE SECTION;
        char  zx_in[64];
        long  zx_depth = 0, zx_score = 0, zx_fee = 0, zx_vat = 0, zx_wht = 0;

        /* (1) 입력 재확인부: 단말ID 확보 (T_STR5/T_STR6/T_KEY1 우선순위) */
        strcpy(zx_svc, "MM_TERMINAL_INQ");
        gets_(b, T_STR5, zx_in, sizeof(zx_in));
        if (zx_in[0] == 0) gets_(b, T_STR6, zx_in, sizeof(zx_in));
        if (zx_in[0] == 0) gets_(b, T_KEY1, zx_in, sizeof(zx_in));
        if (zx_in[0] == 0) strcpy(zx_in, "-");
        strncpy(zx_key, zx_in, sizeof(zx_key)-1); zx_key[sizeof(zx_key)-1] = 0;
        zx_bps = 0;

        /* (2) 단말 마스터 조회부: 소속 가맹점 + 소속 가맹점 상태 */
        strcpy(zx_pmerch, "-"); strcpy(zx_pstat, "NONE");
        EXEC SQL SELECT coalesce(merchant_id,'-') INTO :zx_pmerch
            FROM mm_terminal WHERE terminal_id = :zx_key;
        if (sqlca.sqlcode < 0) FAIL(b);
        if (sqlca.sqlcode == 100) strcpy(zx_pmerch, "-");
        EXEC SQL SELECT coalesce(status,'NONE') INTO :zx_pstat
            FROM mm_merchant_ext WHERE merchant_id = :zx_pmerch;
        if (sqlca.sqlcode < 0) FAIL(b);
        if (sqlca.sqlcode == 100) strcpy(zx_pstat, "NONE");

        /* (3) 업무규칙 분기부: 소속 유효성에 따른 정합 등급 판정 */
        if (strcmp(zx_pmerch, "-") == 0) {
            zx_depth = 0; zx_score = 0;          /* 미존재 단말 */
        } else if (strcmp(zx_pstat, "ACTIVE") == 0) {
            zx_depth = 3; zx_score = 85;         /* 정상 소속 */
        } else if (strcmp(zx_pstat, "NONE") == 0) {
            zx_depth = 1; zx_score = 20;         /* 고아 단말 */
        } else {
            zx_depth = 2; zx_score = 50;         /* 비활성 소속 */
        }

        /* (5) 단말 현황 집계부: 소속 가맹점 보유/가동/폐기 건수 */
        zx_n1 = 0; zx_n2 = 0; zx_orphan = 0; zx_act = 0;
        EXEC SQL SELECT count(*) INTO :zx_n1
            FROM mm_terminal WHERE merchant_id = :zx_pmerch;
        if (sqlca.sqlcode < 0) FAIL(b);
        EXEC SQL SELECT count(*) INTO :zx_act
            FROM mm_terminal WHERE merchant_id = :zx_pmerch AND status = 'ACTIVE';
        if (sqlca.sqlcode < 0) FAIL(b);
        zx_n2 = zx_act;

        /* (6) 전사 단말 정합 재집계부: 고아 단말 탐지 */
        EXEC SQL SELECT count(*) INTO :zx_orphan FROM mm_terminal t
            WHERE NOT EXISTS (SELECT 1 FROM mm_merchant_ext m
                              WHERE m.merchant_id = t.merchant_id);
        if (sqlca.sqlcode < 0) FAIL(b);
        zx_n3 = zx_orphan;
        strncpy(zx_key, zx_pmerch, sizeof(zx_key)-1); zx_key[sizeof(zx_key)-1] = 0;

        /* (2b) 영업일/공휴일 정책 조회 (정산 스케줄 판정 보조) */
        {
            char zc_today[16], zc_next[16];
            int  zc_hol;
            EXEC SQL BEGIN DECLARE SECTION;
            char zc_hd[16];
            long zc_holcnt;
            EXEC SQL END DECLARE SECTION;
            EXEC SQL SELECT to_char(current_date, 'YYYY-MM-DD') INTO :zc_hd;
            if (sqlca.sqlcode < 0) FAIL(b);
            strncpy(zc_today, zc_hd, sizeof(zc_today)-1); zc_today[sizeof(zc_today)-1] = 0;
            acq_next_bizday(zc_today, zc_next);
            zc_hol = mmdb_is_holiday(zc_today);
            EXEC SQL SELECT count(*) INTO :zc_holcnt FROM mm_holiday;
            if (sqlca.sqlcode < 0) FAIL(b);
            if (zc_hol > 0)          userlog("MM_TERMINAL_INQ 금일 공휴일 -> 익영업일 %s", zc_next);
            else if (zc_holcnt == 0) userlog("MM_TERMINAL_INQ 공휴일 마스터 미적재 (기본 스케줄)");
            else                     userlog("MM_TERMINAL_INQ 영업일 처리 익영업일=%s 공휴일수=%ld", zc_next, zc_holcnt);
        }

        /* (4) 본처리 계산부: 기준금액 수수료/부가세/원천 산출 (공통유틸) */
        zx_fee = acq_fee(1000000, zx_bps > 0 ? zx_bps : 25);
        zx_vat = acq_vat(zx_fee);
        zx_wht = acq_wht_amt(zx_fee, 330);
        if (zx_score < 0) zx_score = 0;
        if (zx_score > 100) zx_score = 100;

        /* (7) 감사 로그 적재부: cm_log 처리요약 1건 (실패 시 XA 롤백) */
        EXEC SQL SELECT nextval('cm_log_seq') INTO :zx_logid;
        if (sqlca.sqlcode < 0) FAIL(b);
        snprintf(zx_msg, sizeof(zx_msg),
            "MM_TERMINAL_INQ key=%s d=%ld n1=%ld n2=%ld score=%ld fee=%ld",
            zx_key, zx_depth, zx_n1, zx_n2, zx_score, zx_fee);
        EXEC SQL INSERT INTO cm_log (log_id, svc_name, log_level, msg, biz_date)
            VALUES (:zx_logid, :zx_svc, 'I', :zx_msg, current_date);
        if (sqlca.sqlcode < 0) FAIL(b);

        /* (9) 완료 로깅부: 진입 키/분기/집계 결과 감사 추적 */
        userlog("MM_TERMINAL_INQ 확장후처리 key=%s 분기심도=%ld 점수=%ld", zx_key, zx_depth, zx_score);
        userlog("MM_TERMINAL_INQ 집계 n1=%ld n2=%ld n3=%ld", zx_n1, zx_n2, zx_n3);
        userlog("MM_TERMINAL_INQ 수수료 fee=%ld vat=%ld wht=%ld bps=%ld", zx_fee, zx_vat, zx_wht, zx_bps);
        (void)zx_vat; (void)zx_wht; (void)zx_n3;
    }

    OK(b);
}
