package com.fastcashier.lib_common.util

import java.math.BigDecimal
import java.math.RoundingMode
import java.text.DecimalFormat

object StringPriceFormatUtils {
    /**
     * 分转元
     *
     * @param p
     * @return
     */
    fun transStringPriceToDecimalString(p: String?): String {
        val numberFormat = DecimalFormat("0.00")
        //防止参数不合法异常崩溃
        return try {
            val price = BigDecimal(p)
            val x = BigDecimal("100")
            price.divide(x, 2, RoundingMode.HALF_UP).toString()
        } catch (ex: Exception) {
            ex.printStackTrace()
            //空或转换异常则显示--.--
            "--.--"
        }
    }

    fun transDoubleStringPriceToDecimalString(p: String): String {
        val numberFormat = DecimalFormat("0.00")
        //防止参数不合法异常崩溃
        return try {
            val price = p.toDouble()
            numberFormat.format(price / 100.00)
        } catch (ex: Exception) {
            ex.printStackTrace()
            //空或转换异常则显示--.--
            "--.--"
        }
    }

    fun transStringPriceToDecimalString(p: Double): String {
        val numberFormat = DecimalFormat("0.00")
        //防止参数不合法异常崩溃
        return try {
            numberFormat.format(p / 100.00)
        } catch (ex: Exception) {
            ex.printStackTrace()
            //空或转换异常则显示--.--
            "--.--"
        }
    }

    /**
     * 字符元转字符分
     *
     * @param yuan 字符元
     * @return 字符分
     */
    fun transStringYuan2Fen(yuan: String): String {
        var result = yuan
        var tmp1 = ""
        var tmp2 = ""
        if (yuan.contains(".")) {
            val index = yuan.indexOf(".")
            tmp1 = yuan.substring(0, index)
            tmp2 = yuan.substring(index + 1, yuan.length)
            result = yuan.replace(".", "")
            if (tmp2.length <= 0) {
                result = result + "00"
            } else if (tmp2.length == 1) {
                result = result + "0"
            } else if (tmp2.length > 2) {
                //如果小数点后有3位或以上说明服务器出现异常，此时仍然只取前两位
                result = result.substring(0, index + 2)
            }
        } else {
            result = result + "00"
        }
        return result
    }

    /**
     * 获取实付金额，单位：分
     *
     * @param totalPrice 总价，单位：元
     * @param promPrice  优惠价，单位：元
     * @return 实付金额，单位：分
     */
    fun getPayPriceFenStringFromYuan(totalPrice: String, promPrice: String): String {
        return try {
            val totalPriceInt = transStringYuan2Fen(totalPrice).toInt()
            val promPriceInt = transStringYuan2Fen(promPrice).toInt()
            val payPriceInt = totalPriceInt - promPriceInt
            //检查数字正确性
            if (totalPriceInt < promPriceInt || totalPriceInt < 0 || promPriceInt < 0 || payPriceInt < 0) {
                //参数不正确，返回0
                "0"
            } else payPriceInt.toString() + ""
        } catch (ex: Exception) {
            ex.printStackTrace()
            "0"
        }
    }

    /**
     * 获取实付金额，单位：元
     *
     * @param totalPrice 总价，单位：元
     * @param promPrice  优惠价，单位：元
     * @return 实付金额，单位：元
     */
    fun getPayPriceYuanStringFromYuan(totalPrice: String, promPrice: String): String {
        return try {
            val totalPriceInt = transStringYuan2Fen(totalPrice).toInt()
            val promPriceInt = transStringYuan2Fen(promPrice).toInt()
            val payPriceInt = totalPriceInt - promPriceInt
            //检查数字正确性
            if (totalPriceInt < promPriceInt || totalPriceInt < 0 || promPriceInt < 0 || payPriceInt < 0) {
                //参数不正确，返回0
                "0"
            } else transStringPriceToDecimalString(payPriceInt.toDouble())
        } catch (ex: Exception) {
            ex.printStackTrace()
            "0"
        }
    }

    /**
     * 获取实付金额，单位：分
     *
     * @param totalPrice 总价，单位：分
     * @param promPrice  优惠价，单位：分
     * @return 实付金额，单位：分
     */
    fun getPayPriceFenStringFromFen(totalPrice: String, promPrice: String): String {
        return try {
            val totalPriceInt = totalPrice.toInt()
            val promPriceInt = promPrice.toInt()
            val payPriceInt = totalPriceInt - promPriceInt
            //检查数字正确性
            if (totalPriceInt < promPriceInt || totalPriceInt < 0 || promPriceInt < 0 || payPriceInt < 0) {
                //参数不正确，返回0
                "0"
            } else payPriceInt.toString() + ""
        } catch (ex: Exception) {
            ex.printStackTrace()
            "0"
        }
    }
}