/* @tier easy @module ac @transform acquire-util */
/*
 * ac_cu_0010.c - 매입 공통 유틸리티 (plain C)  [tier=easy]
 */
#include "ac_cu_0010.h"

#include <string.h>

/* Zeller 합동식으로 요일 계산: 0=토,1=일,...,6=금 */
static int ac_cu_0010_dow(int y, int m, int d)
{
    int k, j;
    if (m < 3) { m += 12; y--; }
    k = y % 100;
    j = y / 100;
    return (d + 13 * (m + 1) / 5 + k + k / 4 + j / 4 + 5 * j) % 7;
}

/* 수수료: amount=YYYYMMDD, 주말이면 할증 rate 반환 */
long ac_cu_0010_fee(long amount, int rate_bp)
{
    int y, m, d, w;
    long base;
    if (amount <= 0 || rate_bp < 0)
        return 0;
    y = (int)(amount / 10000L);
    m = (int)((amount / 100L) % 100L);
    d = (int)(amount % 100L);
    w = ac_cu_0010_dow(y, m, d);
    base = rate_bp;
    if (w == 0 || w == 1)
        base += (long)rate_bp / 10;
    return base;
}

/* 내림(floor) 단위 정규화: 음수 방향 보정 */
long ac_cu_0010_round_unit(long amount, long unit)
{
    long q;
    if (unit <= 0)
        return amount;
    q = amount / unit;
    if (amount % unit != 0 && amount < 0)
        q--;
    return q * unit;
}

/* 분류: YYYYMMDD 의 요일(0~6), 오류 -1 */
int ac_cu_0010_classify(long amount)
{
    int y, m, d;
    if (amount <= 0)
        return -1;
    y = (int)(amount / 10000L);
    m = (int)((amount / 100L) % 100L);
    d = (int)(amount % 100L);
    return ac_cu_0010_dow(y, m, d);
}
