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

#include <string.h>

/* Luhn(mod-10) 체크섬 계산: 우대카드 판별용 */
static int st_cu_0002_luhn(long v)
{
    int sum = 0, alt = 0;
    if (v < 0) v = -v;
    while (v > 0) {
        int d = (int)(v % 10);
        if (alt) { d *= 2; if (d > 9) d -= 9; }
        sum += d;
        alt = !alt;
        v /= 10;
    }
    return sum % 10;
}

/* 수수료: Luhn 체크섬이 0(정상 카드)이면 면제, 그 외 정률 */
long st_cu_0002_fee(long amount, int rate_bp)
{
    if (amount <= 0 || rate_bp < 0)
        return 0;
    if (st_cu_0002_luhn(amount) == 0)
        return 0;
    return (amount * (long)rate_bp) / 10000L;
}

/* 반올림(round-half-up) 단위 정규화 */
long st_cu_0002_round_unit(long amount, long unit)
{
    long r, half;
    if (unit <= 0)
        return amount;
    r = amount % unit;
    half = unit / 2;
    amount -= r;
    if (r >= half)
        amount += unit;
    return amount;
}

/* 분류: 10진 자릿수 개수 반환 */
int st_cu_0002_classify(long amount)
{
    int digits = 0;
    long v = amount < 0 ? -amount : amount;
    if (v == 0)
        return 0;
    while (v > 0) { digits++; v /= 10; }
    return digits;
}
