package com.hboxs.serialport.plc.util;

import android.util.Log;


import com.hboxs.serialport.plc.constant.PlcComputeValue;
import com.quyunshuo.androidbaseframemvvm.common.util.ByteUtils;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

/**
 * 进阶参数的参数的16 17 18 22 23 24 的读写
 */
public class AdvacedUtil {

    private static String TAG = "AdvacedUtil";

    /** 获取显示的真正数据 正负数
     * @param dec 二进制
     * @return
     */
    public static String getRealData(String dec) {
        //转成二进制 正码
        ArrayList<Character> stringToList = stringToList(dec);
        StringBuilder stringBuilder = new StringBuilder();
        List<String> list = new ArrayList<>();
        for (int i = 0; i < stringToList.size(); i++) {
            String s1 = stringToList.get(i).toString();
            if (s1.equals("0")) {
                stringBuilder.append("1");
                list.add("1");
            } else {
                stringBuilder.append("0");
                list.add("0");
            }
        }
        System.out.println();
        //反码
//        LogUtil.d(TAG, ":" + "反码为：" + stringBuilder.toString());
        //补码为
        ArrayList<String> list1 = (ArrayList<String>) ((ArrayList<String>) list).clone();
        int i2 = list.lastIndexOf("0");
        for (int i = list.size() - 1; i > 0; i--) {
            if (list.get(i).equals("1")) {
                if (i > i2) {
                    list1.set(i, "0");
                }

            } else if (i == i2) {
                list1.set(i, "1");
            }
        }

        StringBuilder stringBuilder1 = new StringBuilder();
        for (String s1 : list1) {
            stringBuilder1.append(s1);
        }
        BigInteger bigInteger = binaryToDecimal(stringBuilder1.toString());
        String s1 = bigInteger.toString();
//        System.out.println(s1);
//        System.out.println(TAG+ ":" + "补码为：" + stringBuilder1.toString());

        // 如果你想要结果格式化为一位小数，可以使用String.format()或DecimalFormat
        double result = bigInteger.doubleValue()/10.0;
        double i = bigInteger.intValue();
        String formattedResult = String.format("%.1f", result);
        String s = String.valueOf(Math.round((i / PlcComputeValue.Companion.getNum()) * 10));
        Log.d(TAG, "getRealData:" + "数值为：" + formattedResult);
        Log.d(TAG, "getRealData:" + "最后的数值为：" + s);
        return "-" + formattedResult;

    }

    /** 获取显示的真正数据 正负数
     * @param dec 二进制
     * @return
     */
    public static String getRealDataNew(String dec) {
        //转成二进制 正码
//        String s = Integer.toBinaryString(62336);
//        LogUtil.d(TAG, "getRealData:" + "原码为：" + dec);
        ArrayList<Character> stringToList = stringToList(dec);
        StringBuilder stringBuilder = new StringBuilder();
        List<String> list = new ArrayList<>();
//        LogUtil.d(TAG, ":" + "原码为：" + dec);
        for (int i = 0; i < stringToList.size(); i++) {
            String s1 = stringToList.get(i).toString();
//            System.out.print(s1);
            if (s1.equals("0")) {
                stringBuilder.append("1");
                list.add("1");
            } else {
                stringBuilder.append("0");
                list.add("0");
            }
        }
        System.out.println();
        //反码
//        LogUtil.d(TAG, ":" + "反码为：" + stringBuilder.toString());
        //补码为
        ArrayList<String> list1 = (ArrayList<String>) ((ArrayList<String>) list).clone();
        int i2 = list.lastIndexOf("0");
        for (int i = list.size() - 1; i > 0; i--) {
            if (list.get(i).equals("1")) {
                if (i > i2) {
                    list1.set(i, "0");
                }

            } else if (i == i2) {
                list1.set(i, "1");
            }
        }

        StringBuilder stringBuilder1 = new StringBuilder();
        for (String s1 : list1) {
//            System.out.print(s1);
            stringBuilder1.append(s1);
        }
//        System.out.println();
        BigInteger bigInteger = binaryToDecimal(stringBuilder1.toString());
        String s1 = bigInteger.toString();
//        System.out.println(s1);
//        System.out.println(TAG+ ":" + "补码为：" + stringBuilder1.toString());
        int i = bigInteger.intValue();
        String s = String.valueOf(i);
//        LogUtil.d(TAG, "getRealData:" + "数值为：" + i);
//        LogUtil.d(TAG, "getRealData:" + "最后的数值为：" + s);
        return "-" + s;

    }

    /**
     *  获取有符号的16进制
     * @param value 要输入的值 例如想得到1.8 就乘10输入18
     * @return 带符号的16进制(32位处理)
     */
    public static String toHex (String value){
        //1 如果想改成1.8 就输入18
        StringBuilder sb=new StringBuilder();
        //2 判断正负数
        boolean contains = value.contains("-");
        if (contains){
            //去掉符号
            value=value.replace("-","");
            System.out.println(value);
        }
        int i = Integer.valueOf(value);
        System.out.println(i);
        //2 乘于常数 177.78 再除以10 得到 10进制
        int v = (int) Math.round( i * PlcComputeValue.Companion.getNum())/10;
        System.out.println("10进制:"+v);
        String s2="";

        if (contains){
            //负数
//             得到二进制
            System.out.println("负数");
            //获取补码
            String s1 = Integer.toBinaryString(-v);
            System.out.println(s1);
            sb.append("ffff");
            //去除前面的16进制的1111111111111111 防止转换异常
            String substring = s1.substring(s1.length() / 2);
            System.out.println("切割后的数据"+substring);
            String s = Integer.toHexString(Integer.parseInt(substring, 2));
            s2=sb.append(s).toString();

        }else {
            System.out.println("正数");
            // 3 将10进制变成16进制
            String s = ByteUtils.decimal2fitHex(v);
            System.out.println(s);
            sb.append("0000");//双字节处理。可以解决从负数转整数的问题解决。
            if (s.length()<4){
                for (int k=0;k<(4-s.length());k++){
                    sb.append("0");
                }
            }
            sb.append(s);
            s2=sb.toString();
        }
        System.out.println(s2);
        return sb.toString() ;
    }

    /**
     *  获取有符号的16进制
     * @param value 要输入的值 例如想得到1.8 就乘10输入18
     * @return 带符号的16进制(16位处理)
     */
    public static String toHexWith16 (String value){
        //1 如果想改成1.8 就输入18
        StringBuilder sb=new StringBuilder();
        //2 判断正负数
        boolean contains = value.contains("-");
        if (contains){
            //去掉符号
            value=value.replace("-","");
            System.out.println(value);
        }
        int i = Integer.valueOf(value);
        System.out.println(i);
        //2 乘于常数 177.78 再除以10 得到 10进制
        int v = (int) Math.round( i * PlcComputeValue.Companion.getNum())/10;
        System.out.println("10进制:"+v);
        String s2="";
        Log.d(TAG, "toHexWith16: "+contains);
        if (contains){
            //负数
//             得到二进制
            System.out.println("负数");
            //获取补码
            String s1 = Integer.toBinaryString(-v);
            System.out.println(s1);
//            sb.append("ffff");
            //去除前面的16进制的1111111111111111 防止转换异常
            String substring = s1.substring(s1.length() / 2);
            System.out.println("切割后的数据"+substring);
            String s = Integer.toHexString(Integer.parseInt(substring, 2));
            s2=sb.append(s).toString();

        }else {
            System.out.println("正数");
            // 3 将10进制变成16进制
            String s = ByteUtils.decimal2fitHex(v);
            System.out.println(s);
//            sb.append("0000");
            if (s.length()<4){
                for (int k=0;k<(4-s.length());k++){
                    sb.append("0");
                }
            }
            sb.append(s);
            s2=sb.toString();
        }
        System.out.println(s2);
        return s2 ;
    }

    /**
     *  获取有符号的16进制
     * @param value 要输入的值 例如想得到1.8 就乘10输入18
     * @return 带符号的16进制(16位处理)
     */
    public static String toHexWith16New (String value){
        //1 如果想改成1.8 就输入18
        StringBuilder sb=new StringBuilder();
        //2 判断正负数
        boolean contains = value.contains("-");
        if (contains){
            //去掉符号
            value=value.replace("-","");
            System.out.println(value);
        }
        int i = Integer.valueOf(value);
        System.out.println(i);
        //2 乘于常数 177.78 再除以10 得到 10进制
        int v = i;
        System.out.println("10进制:"+v);
        String s2="";

        if (contains){
            //负数
//             得到二进制
            System.out.println("负数");
            //获取补码
            String s1 = Integer.toBinaryString(-v);
            System.out.println(s1);
//            sb.append("ffff");
            //去除前面的16进制的1111111111111111 防止转换异常
            String substring = s1.substring(s1.length() / 2);
            System.out.println("切割后的数据"+substring);
            String s = Integer.toHexString(Integer.parseInt(substring, 2));
            s2=sb.append(s).toString();

        }else {
            System.out.println("正数");
            // 3 将10进制变成16进制
            String s = ByteUtils.decimal2fitHex(v);
            System.out.println(s);
//            sb.append("0000");
            if (s.length()<4){
                for (int k=0;k<(4-s.length());k++){
                    sb.append("0");
                }
            }
            sb.append(s);
            s2=sb.toString();
        }
        System.out.println(s2);
        return sb.toString() ;
    }

    /**
     * string类型转list
     *
     * @param s
     * @return
     */
    private static ArrayList<Character> stringToList(String s) {
        char[] chars = s.toCharArray();
        ArrayList<Character> arrayList = new ArrayList<>();

        for (int i = 0; i < chars.length; i++) {
            arrayList.add(chars[i]);
        }
//        arrayList.add(0,"1".charAt(0));
        return arrayList;
    }

    /**
     * @param binarySource
     * @return int
     * @Description: 二进制转换成十进制
     */
    private static BigInteger binaryToDecimal(String binarySource) {
        BigInteger bi = new BigInteger(binarySource, 2);    //转换为BigInteger类型
//         return Integer.parseInt(bi.toString());     //转换成十进制
        return bi;     //转换成十进制
    }

    public static int formatDoubleTOInt(double dou1, double dou2) {
        BigDecimal big1 = new BigDecimal(Double.valueOf(dou1)).setScale(2, BigDecimal.ROUND_HALF_UP);
        BigDecimal big2 = new BigDecimal(Double.valueOf(dou2));
        return big1.multiply(big2).intValue();

    }

}






