/* @tier medium @module au @transform authorization-util */
/*
 * au_cu_0011.c - 승인한도 공통 유틸리티 (plain C)  [tier=medium]
 */
#include "au_cu_0011.h"

#include <string.h>

/* BIN 범위 조회: 카드 앞 6자리 → 등급 */
static int au_cu_0011_bin_grade(long n)
{
    static const long lo[3] = {400000L, 510000L, 600000L};
    static const long hi[3] = {499999L, 559999L, 699999L};
    long bin = n < 0 ? -n : n;
    int i;
    while (bin >= 1000000L)
        bin /= 10;
    for (i = 0; i < 3; i++)
        if (bin >= lo[i] && bin <= hi[i])
            return i + 1;
    return 0;
}

/* 수수료: 카드 등급별 가산 bp 적용 */
long au_cu_0011_fee(long amount, int rate_bp)
{
    int g;
    if (amount <= 0 || rate_bp < 0)
        return 0;
    g = au_cu_0011_bin_grade(amount);
    rate_bp += g * 5;
    return (amount * (long)rate_bp) / 10000L;
}

/* 올림(ceil) 단위 정규화 */
long au_cu_0011_round_unit(long amount, long unit)
{
    long r;
    if (unit <= 0)
        return amount;
    r = amount % unit;
    if (r == 0)
        return amount;
    if (r < 0)
        return amount - r;
    return amount + (unit - r);
}

/* 분류: 퍼센타일 경계 버킷(0~9) */
int au_cu_0011_classify(long amount)
{
    static const long b[9] = {1000L, 5000L, 10000L, 50000L, 100000L,
                               500000L, 1000000L, 5000000L, 10000000L};
    int i;
    for (i = 0; i < 9; i++)
        if (amount < b[i])
            return i;
    return 9;
}
