package cn.iocoder.yudao.module.tickets.utils;

import cn.hutool.core.date.DateUtil;
import org.springframework.stereotype.Component;

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

/**
 * 工单操作常用util
 * @author vinjor-M
 * @date 16:15 2024/10/18
 **/
@Component
public class TicketsOperateUtil {

    /**
     * 计算车龄
     * @param registerDate 车辆注册日期
     * @return java.lang.Double
     * @author vinjor-M
     * @date 14:47 2025/1/9
     **/
    public Double computeCarYear(Date registerDate) {
        long betweenMonth = DateUtil.betweenMonth(registerDate, new Date(), true);
        String carYear = String.format("%.2f", (double) betweenMonth / 12);
        return Double.parseDouble(carYear);
    }

    /**
     * 计算利润
     * @param salePrice     单个售价（不含折扣）
     * @param purchasePrice 单个进价（采购价格）
     * @param count         数量
     * @return 利润金额
     */
    public BigDecimal calcProfit(BigDecimal salePrice, BigDecimal purchasePrice, int count) {
        if (salePrice == null || purchasePrice == null) {
            return BigDecimal.ZERO;
        }
        BigDecimal c = BigDecimal.valueOf(count);
        return salePrice.multiply(c).subtract(purchasePrice.multiply(c));
    }

    /**
     * 计算利润率
     * @param salePrice     单个售价（不含折扣）
     * @param purchasePrice 单个进价（采购价格）
     * @param count         数量
     * @return 利润率（0-1之间的小数，保留2位）
     */
    public BigDecimal calcProfitRate(BigDecimal salePrice, BigDecimal purchasePrice, int count) {
        if (salePrice == null || purchasePrice == null || count <= 0) {
            return BigDecimal.ZERO;
        }

        BigDecimal c = BigDecimal.valueOf(count);
        BigDecimal saleTotal = salePrice.multiply(c);
        if (saleTotal.compareTo(BigDecimal.ZERO) == 0) {
            return BigDecimal.ZERO;
        }

        BigDecimal profit = saleTotal.subtract(purchasePrice.multiply(c));
        return profit.divide(saleTotal, 2, RoundingMode.HALF_UP);
    }

    /**
     * 计算利润
     * @param salePrice     单个售价（不含折扣）
     * @param purchasePrice 单个进价（采购价格）
     * @return 利润金额
     */
    public BigDecimal calcProfit(BigDecimal salePrice, BigDecimal purchasePrice) {
        return calcProfit(salePrice, purchasePrice, 1);
    }

    /**
     * 计算利润率
     * @param salePrice     售价（不含折扣）
     * @param purchasePrice 进价（采购价格）
     * @return 利润率（0-1之间的小数，保留2位）
     */
    public BigDecimal calcProfitRate(BigDecimal salePrice, BigDecimal purchasePrice) {
        return calcProfitRate(salePrice, purchasePrice, 1);
    }
}
