package com.zioinfo.kintex.settlement;

/**
 * F084 옥션 수수료 산정(순수 함수 — 단위 테스트 대상).
 *
 * <p><b>수수료 = 낙찰가(부가세 별도 경쟁 금액) × 요율</b>. 요율은 룰셋(master_data RATE.auctionFeeRate, 퍼센트)
 * 참조, 없으면 기본 정률 {@link #DEFAULT_FEE_RATE_PERCENT}%. 부가세 10% 별도 부과.
 *
 * <ul>
 *   <li>base = 낙찰 응찰의 {@code bid.total}(부가세 별도 소계 = 경쟁/순위 금액)</li>
 *   <li>fee  = round(base × ratePercent / 100)</li>
 *   <li>vat  = round(fee × 10%)</li>
 *   <li>total = fee + vat</li>
 * </ul>
 * <p><b>룰 키</b>: {@code master_data(category='RATE', code='auctionFeeRate')} — value_json 숫자(%).
 */
public final class AuctionFee {

    /** 룰셋 미설정 시 기본 수수료율(%). */
    public static final double DEFAULT_FEE_RATE_PERCENT = 5.0;
    /** 룰 키(문서화·시드 정합). */
    public static final String RATE_CATEGORY = "RATE";
    public static final String RATE_CODE = "auctionFeeRate";

    private static final double VAT_RATE = 0.10;

    private AuctionFee() {
    }

    /** 수수료 산정 결과. base=낙찰가(부가세 별도), fee=수수료 공급가액, vat=부가세, total=수수료 청구 총액. */
    public record Fee(long base, double ratePercent, long fee, long vat, long total) {
    }

    /**
     * 수수료 산정. ratePercent 가 null/음수/0 이면 기본 요율을 사용한다(0% 무료 정책은 미지원 — 기본 적용).
     * winningTotalExVat 가 0 이하이면 수수료 0(청구 생성 없음 판정은 호출부에서 수행).
     */
    public static Fee compute(long winningTotalExVat, Double ratePercent) {
        double rate = (ratePercent == null || ratePercent <= 0) ? DEFAULT_FEE_RATE_PERCENT : ratePercent;
        if (winningTotalExVat <= 0) {
            return new Fee(Math.max(winningTotalExVat, 0), rate, 0, 0, 0);
        }
        long fee = Math.round(winningTotalExVat * rate / 100.0);
        long vat = Math.round(fee * VAT_RATE);
        return new Fee(winningTotalExVat, rate, fee, vat, fee + vat);
    }
}
