package com.erp.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

public class DecimalUtils {

    private DecimalUtils() {}

    /** String → BigDecimal 변환. null 또는 빈 문자열 → ZERO */
    public static BigDecimal parse(String value) {
        if (value == null) return BigDecimal.ZERO;
        String str = value.trim();
        if (str.isEmpty()) return BigDecimal.ZERO;
        return new BigDecimal(str);
    }

    public static BigDecimal toBigDecimal(Object value) {
        if (value == null) return BigDecimal.ZERO;
        if (value instanceof BigDecimal bd) return bd;
        if (value instanceof Number n) return new BigDecimal(n.toString());
        String str = value.toString().trim();
        if (str.isEmpty()) return BigDecimal.ZERO;
        return new BigDecimal(str);
    }

    public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) {
        try {
            return toBigDecimal(value);
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }

    public static BigDecimal scale2(BigDecimal value) {
        if (value == null) return BigDecimal.ZERO;
        return value.setScale(2, RoundingMode.HALF_UP);
    }

    /** String 전용 곱셈 — 결과를 소수점 4자리로 반환 */
    public static BigDecimal multiply(String a, String b) {
        return parse(a).multiply(parse(b)).setScale(4, RoundingMode.HALF_UP);
    }

    public static BigDecimal multiply(Object a, Object b) {
        return toBigDecimal(a).multiply(toBigDecimal(b));
    }

    public static BigDecimal add(Object a, Object b) {
        return toBigDecimal(a).add(toBigDecimal(b));
    }

    public static BigDecimal subtract(Object a, Object b) {
        return toBigDecimal(a).subtract(toBigDecimal(b));
    }

    /**
     * 세금 포함 금액 계산: amount + (amount * taxRate / 100)
     * 결과는 소수점 2자리 반환
     */
    public static BigDecimal addTax(String amount, String taxRate) {
        BigDecimal amt = parse(amount);
        BigDecimal rate = parse(taxRate);
        BigDecimal tax = amt.multiply(rate).divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP);
        return amt.add(tax).setScale(2, RoundingMode.HALF_UP);
    }

    /** 나눗셈 — scale 지정, HALF_UP 반올림 */
    public static BigDecimal divide(String a, String b, int scale) {
        return parse(a).divide(parse(b), scale, RoundingMode.HALF_UP);
    }

    /** 문자열 숫자 목록의 합산. null → ZERO */
    public static BigDecimal sum(List<String> values) {
        if (values == null) return BigDecimal.ZERO;
        BigDecimal total = BigDecimal.ZERO;
        for (String v : values) {
            total = total.add(parse(v));
        }
        return total;
    }
}
