package com.tanpu.fund.utils;

import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author: zhoupeng
 * @email: zhoupeng_08@163.com
 */
public class FundMethod {

    private static BigDecimal BASE_DIVISOR = new BigDecimal(10000);

    /**
     * <p>盈亏金额</p>
     * 盈亏金额=市值-成本
     *
     * @param market 市值
     * @param cost   成本
     * @return 盈亏金额
     */
    public static String profitLossMoney(String market, String cost) {
        return toBigDecimal(market).subtract(toBigDecimal(cost)).toString();
    }

    /**
     * <p>市值</p>
     * 市值=确认份额*最新净值/10000-确认份额*分红比例/10000
     *
     * @param share 确认份额
     * @param net   最新净值
     * @param bonus 分红比例
     * @return 市值
     */
    public static String marketValue(String share, String net, String bonus) {

        String market;
        if (StringUtils.isNotBlank(bonus)) {

            // TODO 精度待确认
            market = toBigDecimal(share).multiply(toBigDecimal(net).subtract(toBigDecimal(bonus))).divide(BASE_DIVISOR, 6).toString();
        } else {
            market = toBigDecimal(share).multiply(toBigDecimal(net)).divide(BASE_DIVISOR, 6).toString();
        }
        return market;
    }

    /**
     * <p>初始权重</p>
     * 基金初始权重=基金成本/组合基金总成本
     *
     * @param cost    基金成本
     * @param allCost 组合基金总成本
     * @return 基金初始权重
     */
    public static String initWeight(String cost, String allCost) {
        // TODO
        return toBigDecimal(cost).divide(toBigDecimal(allCost), 2).toString();
    }

    public static String maxNet(List<String> nets) {
        List<BigDecimal> bNets = nets.stream().map(FundMethod::toBigDecimal).collect(Collectors.toList());

        BigDecimal max = Collections.max(bNets);
        BigDecimal min = Collections.min(bNets);

        // TODO
        return max.subtract(min).divide(max, 6).toString();
    }

    public static BigDecimal toBigDecimal(String s) {
        return new BigDecimal(s);
    }

    public static BigDecimal toBigDecimal(double s) {
        return new BigDecimal(Double.toString(s));
    }

    public static double toDouble(BigDecimal b) {
        return Double.parseDouble(b.toString());
    }

}