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

#include <string.h>

/* CRC-8(다항식 0x07) 계산: 고정길이 필드 무결성 */
static unsigned st_cu_0006_crc8(const char *s, int n)
{
    unsigned crc = 0;
    int i, b;
    for (i = 0; i < n; i++) {
        crc ^= (unsigned char)s[i];
        for (b = 0; b < 8; b++)
            crc = (crc & 0x80) ? ((crc << 1) ^ 0x07) & 0xFF : (crc << 1) & 0xFF;
    }
    return crc & 0xFF;
}

/* 수수료: 금액을 12자리 고정필드로 pack 후 CRC 가산 */
long st_cu_0006_fee(long amount, int rate_bp)
{
    char buf[16];
    long v = amount < 0 ? 0 : amount;
    int i;
    if (amount <= 0 || rate_bp < 0)
        return 0;
    for (i = 11; i >= 0; i--) { buf[i] = (char)('0' + (int)(v % 10)); v /= 10; }
    buf[12] = '\0';
    return (amount * (long)rate_bp) / 10000L + (long)st_cu_0006_crc8(buf, 12);
}

/* 최근접 배수 반올림(round-half-away-from-zero) */
long st_cu_0006_round_unit(long amount, long unit)
{
    long r, h;
    if (unit <= 0)
        return amount;
    r = amount % unit;
    h = (unit + 1) / 2;
    if (r < 0)
        return (-r >= h) ? amount - (unit + r) : amount - r;
    return (r >= h) ? amount + (unit - r) : amount - r;
}

/* 분류: 부호·홀짝 조합 4가지 */
int st_cu_0006_classify(long amount)
{
    int s = amount < 0 ? 2 : 0;
    int p = (amount % 2 != 0) ? 1 : 0;
    return s + p;
}
