package com.yunyan.business.document.utils;

import cn.hutool.core.util.NumberUtil;
import com.yunyan.common.utils.NumberFormatUtils;
import com.yunyan.common.utils.StringUtils;

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

public class ReadExcelUtil {

    public static void main(String[] args) {

    }

    /**
     * 截取 map 的string 从某个字符串 开始
     * @param map
     * @param key
     * @param targetTagBegin
     * @return
     */
    public static String getMapSubString(LinkedHashMap<Integer, String> map, Integer key, String targetTagBegin) {
        String mapStr = map.getOrDefault(key, "");
        if(StringUtils.isNotBlank(targetTagBegin)) {
            mapStr = mapStr.substring(mapStr.indexOf(targetTagBegin)+1);
        }

        return mapStr;
    }

    /**
     * 读取 excel的表格的数值, 加千分位分隔, 万元转 元
     * @param map
     * @param key
     * @return
     */
    public static String getMapNumFormatInThousandsYuan(LinkedHashMap<Integer, String> map, Integer key) {

        return ReadExcelUtil.getMapNumFormatInThousandsYuan(map, key, null);

        /*String mapStr = map.getOrDefault(key, "").replace(",","");
        if(StringUtils.isNotBlank(mapStr) && mapStr.contains("—")) {
            mapStr = mapStr.replace("—", "0");
        }

        String res = mapStr;
        res = NumberFormatUtils.amountInThousandsYuan(mapStr);

        return res;*/
    }

    /**
     * 读取 excel的表格的数值, 加千分位分隔, 万元转 元
     * @param map
     * @param key
     * @param defaultReturnValue 空值的返回值
     * @return
     */
    public static String getMapNumFormatInThousandsYuan(LinkedHashMap<Integer, String> map, Integer key, String defaultReturnValue) {
        //String mapStr = map.getOrDefault(key, "").replace(",","");
        String mapStr = map.getOrDefault(key, "").replace(",","");
        if(StringUtils.isNotBlank(mapStr) && mapStr.contains("—")) {
            mapStr = mapStr.replace("—", "0");
        }

        String res = mapStr;
        res = NumberFormatUtils.amountInThousandsYuan(mapStr);

        if(StringUtils.isBlank(res) && null != defaultReturnValue) {
            return defaultReturnValue;
        }

        return res;
    }

    /**
     * 读取 单元格的 数值, 并千分位分隔符格式化
     * @param map
     * @param key
     * @param defaultValue
     * @return
     */
    public static String mapNumFormat(LinkedHashMap<Integer, String> map, Integer key, String defaultValue) {
        String mapStr = ReadExcelUtil.getMapOrDefault(map, key, defaultValue);
        //String mapStr = map.getOrDefault(key, "").replace(",","");
        if(StringUtils.isBlank(mapStr)) {
            return defaultValue;
        }

        if(StringUtils.isNotBlank(mapStr) && mapStr.contains(",")) {
            mapStr  = mapStr.replace(",", "");
        }
        if(StringUtils.isNotBlank(mapStr) && mapStr.contains("—")) {
            mapStr = mapStr.replace("—", defaultValue);
        }

        String res = NumberFormatUtils.addThousandSeparatorForInteger(mapStr);

        /*if(StringUtils.isBlank(res) && null != defaultReturnValue) {
            return defaultReturnValue;
        }*/

        return res;
    }

    /**
     * 字符串 数值 千分位分隔符 格式化
     * @param strvalue
     * @param defaultValue
     * @return
     */
    public static String strNumFormat(String strvalue, String defaultValue) {
        String result = strvalue;
        if(StringUtils.isBlank(result)) {
            return defaultValue;
        }

        if(StringUtils.isNotBlank(result) && result.contains(",")) {
            result  = result.replace(",", "");
        }

        if(StringUtils.isNotBlank(result) && strvalue.contains("—")) {
            result  = result.replace("—", defaultValue);
        }

        //数值 千分位分隔符 格式化
        result = NumberFormatUtils.addThousandSeparatorForInteger(result);

        return result;
    }

    /**
     *  读取 map, 空字符串转变为 默认值
     * @param map
     * @param key
     * @param defaultValue
     * @return
     */
    public static String getMapOrDefault(LinkedHashMap<Integer, String> map, Object key, String defaultValue) {
        String value = map.getOrDefault(key, defaultValue);
        if(StringUtils.isBlank(value)) {
            value = defaultValue;
        }

        return value;
    }


    /**
     * 读取 表单元的数值
     * @param map
     * @param key
     * @param targetTag
     * @param replacement
     * @return
     */
    public static String getMapNum(LinkedHashMap<Integer, String> map, Integer key, String targetTag, String replacement) {
        String mapStr = map.getOrDefault(key, "");
        if(StringUtils.isNotBlank(targetTag)) {
            String replaceStr = StringUtils.isNotBlank(replacement) ? replacement : "";
            mapStr = mapStr.replace(targetTag, replaceStr);
        }

        return mapStr;
    }


    /**
     * 字符串数字转 bigdecimal
     * @param str
     * @return
     */
    public static BigDecimal toBigDecimalByStr(String str) {
        BigDecimal res = BigDecimal.ZERO;
        if(StringUtils.isBlank(str)) {
            return res;
        }

        str = str.replace(",","");
        res = new BigDecimal(str);
        return res;
    }

    /**
     * 把 千分位分隔 的字符串转数字字符串
     * @param str
     * @return
     */
    public static String numReplaceStr(String str) {
        if(StringUtils.isBlank(str)) {
            return str;
        }

        str = str.replace(",","");
        return str;
    }

    /**
     * 比较2个字符串的数, 正常的数, 不包含格式化后的
     * @param val1 本年
     * @param val2 去年
     * @return
     */
    public static String getChangeValueWord(String val1, String val2) {

        if(StringUtils.isBlank(val1)) {
            val1 = "0";
        }

        if(StringUtils.isBlank(val2)) {
            val2 = "0";
        }

        //数值变化
        BigDecimal subRes = NumberUtil.sub(val1, val2);
        String str = subRes.compareTo(BigDecimal.ZERO) != -1 ? "增加" : "减少";

        return str;
    }

    /**
     * 获取 2个数 比较的 变化率的 文字
     * @param val1 本年
     * @param val2 去年
     * @return
     */
    public static String getChangeRatioWord(String val1, String val2) {

        if(StringUtils.isBlank(val1)) {
            val1 = "0";
        }

        if(StringUtils.isBlank(val2)) {
            val2 = "0";
        }

        //数值变化
        BigDecimal subRes = NumberUtil.sub(val1, val2);
        String str = subRes.compareTo(BigDecimal.ZERO) != -1 ? "增长" : "下降";

        return str;
    }

    /**
     * 相减2个字符串的数的结果比较, 正常的数, 不包含格式化后的
     * @param subNum 本年数 - 去年数
     * @param
     * @return
     */
    public static String getChangeValueWord(BigDecimal subNum) {
        //数值变化
        String str = subNum.compareTo(BigDecimal.ZERO) != -1 ? "增加" : "减少";

        return str;
    }

    /**
     * 获取 2个数 相减后的数 比较的 变化率的 文字
     * @param subNum 本年数 - 去年数
     * @return
     */
    public static String getChangeRatioWord(BigDecimal subNum) {
        //数值变化
        String str = subNum.compareTo(BigDecimal.ZERO) != -1 ? "增长" : "下降";
        return str;
    }

    /**
     * 获取变化数的变化率/或者 占比   subNum/ val2
     * @param val2 去年(初始数)
     * @param subNum 本年数 - 去年数
     * @return
     */
    public static String getChangeRatioValue(String val2, BigDecimal subNum) {
        String str = "";
        //比率变化
        BigDecimal ratioRes = BigDecimal.ZERO;
        //0 的不要
        BigDecimal val2BigDecimal = BigDecimal.ZERO;
        if(StringUtils.isNotBlank(val2)) {
            val2BigDecimal = new BigDecimal(val2);
        }
        if (val2BigDecimal.compareTo(BigDecimal.ZERO) != 0) {
            ratioRes = subNum.abs().multiply(new BigDecimal(100)).divide(val2BigDecimal, 1, RoundingMode.HALF_DOWN);
        } else if (val2BigDecimal.compareTo(BigDecimal.ZERO) == 0 && subNum.compareTo(BigDecimal.ZERO) != 0 ) {
            ratioRes = new BigDecimal(100);
        }

        return NumberFormatUtils.format1(ratioRes);
    }

    /**
     * 获取变化数的变化率/或者 占比   subNum/ val2
     * @param val2 去年(初始数)
     * @param subNum 本年数 - 去年数
     * @return
     */
    public static String getChangeRatioValue(String val2, BigDecimal subNum, int scale) {
        String str = "";
        //比率变化
        BigDecimal ratioRes = BigDecimal.ZERO;
        //0 的不要
        BigDecimal val2BigDecimal = BigDecimal.ZERO;
        if(StringUtils.isNotBlank(val2)) {
            val2BigDecimal = new BigDecimal(val2);
        }
        if (val2BigDecimal.compareTo(BigDecimal.ZERO) != 0) {
            ratioRes = subNum.abs().multiply(new BigDecimal(100)).divide(val2BigDecimal, scale, RoundingMode.HALF_DOWN);
        } else if (val2BigDecimal.compareTo(BigDecimal.ZERO) == 0 && subNum.compareTo(BigDecimal.ZERO) != 0 ) {
            ratioRes = new BigDecimal(100);
        }

        return ratioRes.toString();
    }

    /**
     * 获取变化数的变化率/或者 占比   subNum/ val2
     * @param val2 去年(初始数)
     * @param subNum 本年数 - 去年数
     * @return
     */
    public static String getChangeRatioValue(BigDecimal val2, BigDecimal subNum) {
        String str = "";
        //比率变化
        BigDecimal ratioRes = BigDecimal.ZERO;
        //0 的不要
        BigDecimal val2BigDecimal = val2;
        /*BigDecimal val2BigDecimal = BigDecimal.ZERO;
        if(StringUtils.isNotBlank(val2)) {
            val2BigDecimal = new BigDecimal(val2);
        }*/
        if (val2BigDecimal.compareTo(BigDecimal.ZERO) != 0) {
            ratioRes = subNum.abs().multiply(new BigDecimal(100)).divide(val2BigDecimal, 2, RoundingMode.HALF_DOWN);
        } else if (val2BigDecimal.compareTo(BigDecimal.ZERO) == 0 && subNum.compareTo(BigDecimal.ZERO) != 0 ) {
            ratioRes = new BigDecimal(100);
        }

        return ratioRes.toString();
    }

    /**
     * 获取变化数的变化率/或者 占比   subNum/ val2
     * @param val2 去年(初始数)
     * @param subNum 本年数 - 去年数
     * @param scale 小位数
     * @return
     */
    public static String getChangeRatioValue(BigDecimal val2, BigDecimal subNum, int scale) {
        String str = "";
        //比率变化
        BigDecimal ratioRes = BigDecimal.ZERO;
        //0 的不要
        BigDecimal val2BigDecimal = val2;
        /*BigDecimal val2BigDecimal = BigDecimal.ZERO;
        if(StringUtils.isNotBlank(val2)) {
            val2BigDecimal = new BigDecimal(val2);
        }*/
        if (val2BigDecimal.compareTo(BigDecimal.ZERO) != 0) {
            ratioRes = subNum.abs().multiply(new BigDecimal(100)).divide(val2BigDecimal, scale, RoundingMode.HALF_DOWN);
        } else if (val2BigDecimal.compareTo(BigDecimal.ZERO) == 0 && subNum.compareTo(BigDecimal.ZERO) != 0 ) {
            ratioRes = new BigDecimal(100);
        }

        return NumberFormatUtils.format1(ratioRes);
    }

}
