/* @tier medium @module lg @transform ledger-util */
/*
 * lg_cu_0005.c - 원장 공통 유틸리티 (plain C)  [tier=medium]
 */
#include "lg_cu_0005.h"

#include <string.h>

/* 통화 스케일 환산 수수료: minor unit 로 확장 후 요율 적용, major 복귀 */
long lg_cu_0005_fee(long amount, int rate_bp)
{
    long scaled, fee;
    if (amount <= 0 || rate_bp < 0)
        return 0;
    scaled = amount * 100L;
    fee = (scaled * (long)rate_bp) / 10000L;
    fee = fee / 100L;
    return fee;
}

/* 내림(음의 무한대 방향)으로 unit 정규화 */
long lg_cu_0005_round_unit(long amount, long unit)
{
    long q, r;
    if (unit <= 0)
        return amount;
    q = amount / unit;
    r = amount - q * unit;
    if (r < 0)
        q -= 1;
    return q * unit;
}

/* 임계값 테이블 이분 탐색으로 백분위 버킷 분류 */
int lg_cu_0005_classify(long amount)
{
    static const long th[] = { 5000L, 50000L, 500000L, 5000000L, 50000000L };
    int lo = 0, hi = 5, mid;
    while (lo < hi) {
        mid = (lo + hi) / 2;
        if (amount < th[mid]) hi = mid; else lo = mid + 1;
    }
    return lo;
}
