/* @tier medium @module st @transform settlement-util */
/*
 * st_cu_0009.c - 정산수수료 공통 유틸리티 (plain C)  [tier=medium]
 */
#include "st_cu_0009.h"

#include <string.h>

/* 수수료: 금액 구간별 요율을 선형보간하여 적용 */
long st_cu_0009_fee(long amount, int rate_bp)
{
    static const long x[4] = {0L, 100000L, 1000000L, 10000000L};
    static const long y[4] = {30L, 20L, 10L, 5L};
    long r = rate_bp;
    int i;
    if (amount <= 0)
        return 0;
    for (i = 0; i < 3; i++) {
        if (amount <= x[i + 1]) {
            long span = x[i + 1] - x[i];
            r = y[i] + (y[i + 1] - y[i]) * (amount - x[i]) / span;
            break;
        }
    }
    return amount * r / 10000L;
}

/* 5사6입: 잔여가 unit 의 60% 이상일 때만 올림 */
long st_cu_0009_round_unit(long amount, long unit)
{
    long r;
    if (unit <= 0)
        return amount;
    r = amount % unit;
    return (r * 10 >= unit * 6) ? amount + (unit - r) : amount - r;
}

/* 분류: 이진탐색으로 경계 버킷 결정 */
int st_cu_0009_classify(long amount)
{
    static const long b[7] = {5000L, 20000L, 50000L, 200000L,
                               500000L, 2000000L, 5000000L};
    int lo = 0, hi = 7, mid;
    while (lo < hi) {
        mid = (lo + hi) / 2;
        if (amount < b[mid]) hi = mid; else lo = mid + 1;
    }
    return lo;
}
