/* @tier easy @module vl @transform validation-online */
/*
 * vl_ol_0028.pgc - 오류내역 조회 서비스 (VL_OL_0028)  [tier=easy]
 *
 * 입력 에러코드로 오류로그(vl_error_log) 의 최근 1건(발생일시/사유/처리키)
 * 을 조회하여 응답한다.
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "txcore.h"
#include "txcore_dbio.h"
#include "acq_util.h"
#include "vl_core.h"

EXEC SQL INCLUDE sqlca;

TX_SERVICE(VL_OL_0028, ctx)
{
    EXEC SQL BEGIN DECLARE SECTION;
    char h_errcode[8];
    char h_occur_dt[15];
    char h_reason[128];
    char h_ref_key[16];
    EXEC SQL END DECLARE SECTION;

    char errcode[8];

    tx_log(TX_LOG_INFO, "[VL_OL_0028] 오류내역 조회 서비스 진입");

    if (tx_buf_get(ctx->in, "ERRCODE", errcode, sizeof(errcode)) != TX_OK) {
        tx_log(TX_LOG_ERROR, "[VL_OL_0028] 조회 에러코드(ERRCODE) 누락");
        tx_buf_sets(ctx->out, "ERRCODE", "VL2800");
        tx_return(ctx, TX_EINVAL, ctx->out);
        return;
    }
    if (strlen(errcode) == 0) {
        tx_log(TX_LOG_WARN, "[VL_OL_0028] 에러코드 공백");
        tx_buf_sets(ctx->out, "ERRCODE", "VL2801");
        tx_return(ctx, TX_EINVAL, ctx->out);
        return;
    }

    strncpy(h_errcode, errcode, sizeof(h_errcode) - 1);
    h_errcode[sizeof(h_errcode) - 1] = '\0';

    memset(h_occur_dt, 0, sizeof(h_occur_dt));
    memset(h_reason, 0, sizeof(h_reason));
    memset(h_ref_key, 0, sizeof(h_ref_key));

    EXEC SQL
        SELECT occur_dt, reason, ref_key
          INTO :h_occur_dt, :h_reason, :h_ref_key
          FROM vl_error_log
         WHERE err_code = :h_errcode
         ORDER BY occur_dt DESC
         FETCH FIRST 1 ROW ONLY;

    if (sqlca.sqlcode == TX_SQL_NOTFOUND) {
        tx_log(TX_LOG_INFO, "[VL_OL_0028] 오류내역 없음 code=%s", errcode);
        tx_buf_reset(ctx->out);
        tx_buf_sets(ctx->out, "QUERYCODE", errcode);
        tx_buf_sets(ctx->out, "RESULT", "NONE");
        tx_buf_sets(ctx->out, "ERRCODE", "VL2802");
        tx_return(ctx, TX_ENOENT, ctx->out);
        return;
    }
    if (sqlca.sqlcode != TX_SQL_OK) {
        TX_DBIO_LOG_ERR("SELECT vl_error_log");
        tx_buf_sets(ctx->out, "ERRCODE", "VL2809");
        tx_return(ctx, TX_EDB, ctx->out);
        return;
    }

    tx_buf_reset(ctx->out);
    tx_buf_sets(ctx->out, "QUERYCODE", errcode);
    tx_buf_sets(ctx->out, "OCCURDT", h_occur_dt);
    tx_buf_sets(ctx->out, "REASON", h_reason);
    tx_buf_sets(ctx->out, "REFKEY", h_ref_key);
    tx_buf_sets(ctx->out, "RESULT", "FOUND");
    tx_buf_sets(ctx->out, "ERRCODE", RESP_OK);

    tx_log(TX_LOG_INFO, "[VL_OL_0028] 오류내역 조회 code=%s dt=%s key=%s",
           errcode, h_occur_dt, h_ref_key);
    tx_return(ctx, TX_OK, ctx->out);
}
