'use strict';

/**
 * BigInt 변환 캐싱 유틸.
 * JS Number의 53bit 초과 정수 정밀도 손실 방지용 BigInt 변환은 비용이 있는 작업이므로
 * 한 라이프사이클 내 동일 값에 대해 1회만 수행.
 */

function bigStr(v) {
    if (v == null) return '';
    try {
        return BigInt(v).toString();
    } catch (e) {
        return String(v);
    }
}

/**
 * ctx.id를 BigInt-precise string으로 반환. ctx에 _txidStr로 캐싱.
 */
function ctxTxidStr(ctx) {
    if (!ctx) return '';
    if (ctx._txidStr) return ctx._txidStr;
    ctx._txidStr = bigStr(ctx.id);
    return ctx._txidStr;
}

/**
 * 임의 step_id를 BigInt-precise string으로 반환. 라이프사이클 짧으면 캐싱 안 함.
 */
function stepIdStr(stepIdRaw) {
    return bigStr(stepIdRaw);
}

module.exports = { bigStr, ctxTxidStr, stepIdStr };
