/*
 * MM_MCC_RISKLIST.pgc - mm 모듈 서비스 MM_MCC_RISKLIST (one service = one file).
 * 기능: 고위험 MCC 현황 (기준 위험도 이상 MCC 수, 최고 위험도, 소속 활성 가맹점 수).
 * 입력: T_ARG1=최소 위험도(기본 3). 출력: T_COUNT, T_ARG2, T_ARG3.
 * caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음); mm_svr가 tpadvertise 한다.
 */
#include "MM_MCC_RISKLIST.h"

void MM_MCC_RISKLIST(TPSVCINFO *p)
{
    UBFH *b = (UBFH *)p->data;
    EXEC SQL BEGIN DECLARE SECTION;
    long h_min, h_cnt, h_max, h_merch;
    EXEC SQL END DECLARE SECTION;

    h_min = getl(b, T_ARG1);
    if (h_min <= 0) h_min = 3;

    EXEC SQL SELECT count(*), coalesce(max(risk_level), 0)
        INTO :h_cnt, :h_max
        FROM mm_mcc WHERE risk_level >= :h_min;
    if (sqlca.sqlcode < 0) FAIL(b);

    EXEC SQL SELECT count(*) INTO :h_merch
        FROM mm_merchant_ext me
        WHERE me.status = 'ACTIVE'
          AND EXISTS (SELECT 1 FROM mm_mcc c
                      WHERE c.mcc = me.mcc AND c.risk_level >= :h_min);
    if (sqlca.sqlcode < 0) FAIL(b);

    setl(b, T_COUNT, h_cnt);
    setl(b, T_ARG2, h_max);
    setl(b, T_ARG3, h_merch);
    setl(b, T_RC, 0);

    /* ====================================================================
     * [심화 후처리] MM_MCC_RISKLIST - MCC 업종 마스터 리스크/감사 확장부 (mm 업종)
     * 업종 위험도와 참조 가맹점 현황을 재산정하고 감사 로그를 남긴다.
     * ==================================================================== */
    {
        EXEC SQL BEGIN DECLARE SECTION;
        char  zx_svc[24], zx_key[64], zx_name[64], zx_msg[192];
        long  zx_logid, zx_n1, zx_n2, zx_n3, zx_bps, zx_risk, zx_users;
        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) 입력 재확인부: MCC 코드 확보 (T_CATEGORY/T_KEY1) */
        strcpy(zx_svc, "MM_MCC_RISKLIST");
        gets_(b, T_CATEGORY, 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, "0000");
        strncpy(zx_key, zx_in, sizeof(zx_key)-1); zx_key[sizeof(zx_key)-1] = 0;
        zx_bps = 0;

        /* (2) 업종 마스터 조회부: 명칭 + 위험도 */
        strcpy(zx_name, "-"); zx_risk = 1;
        EXEC SQL SELECT coalesce(mcc_name,'-'), coalesce(risk_level,1)
            INTO :zx_name, :zx_risk FROM mm_mcc WHERE mcc = :zx_key;
        if (sqlca.sqlcode < 0) FAIL(b);
        if (sqlca.sqlcode == 100) { strcpy(zx_name, "-"); zx_risk = 0; }

        /* (3) 업무규칙 분기부: 위험도 구간별 감사 심도/점수 */
        if (zx_risk >= 4) {
            zx_depth = 3; zx_score = 90;         /* 고위험 업종 */
        } else if (zx_risk >= 2) {
            zx_depth = 2; zx_score = 60;         /* 중위험 업종 */
        } else if (zx_risk == 1) {
            zx_depth = 1; zx_score = 30;         /* 저위험 업종 */
        } else {
            zx_depth = 0; zx_score = 0;          /* 미등록 업종 */
        }

        /* (5) 참조 현황 집계부: 해당 MCC 사용 가맹점(전체/활성) */
        zx_n1 = 0; zx_users = 0;
        EXEC SQL SELECT count(*) INTO :zx_n1
            FROM mm_merchant_ext WHERE mcc = :zx_key;
        if (sqlca.sqlcode < 0) FAIL(b);
        EXEC SQL SELECT count(*) INTO :zx_users
            FROM mm_merchant_ext WHERE mcc = :zx_key AND status = 'ACTIVE';
        if (sqlca.sqlcode < 0) FAIL(b);
        zx_n2 = zx_users;

        /* (6) 전사 업종 재집계부: 고위험 MCC 총수 + 평균 위험도 */
        zx_n3 = 0;
        EXEC SQL SELECT count(*) INTO :zx_n3 FROM mm_mcc WHERE risk_level >= 4;
        if (sqlca.sqlcode < 0) FAIL(b);

        /* (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_MCC_RISKLIST 금일 공휴일 -> 익영업일 %s", zc_next);
            else if (zc_holcnt == 0) userlog("MM_MCC_RISKLIST 공휴일 마스터 미적재 (기본 스케줄)");
            else                     userlog("MM_MCC_RISKLIST 영업일 처리 익영업일=%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_MCC_RISKLIST 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_MCC_RISKLIST 확장후처리 key=%s 분기심도=%ld 점수=%ld", zx_key, zx_depth, zx_score);
        userlog("MM_MCC_RISKLIST 집계 n1=%ld n2=%ld n3=%ld", zx_n1, zx_n2, zx_n3);
        userlog("MM_MCC_RISKLIST 수수료 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);
}
