

package fr.zng.xxzx.common.util;


import java.awt.Color;
import java.io.DataOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.Socket;
import java.util.HashSet;
import java.util.UUID;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JTextArea;

import org.apache.log4j.Logger;

import fr.zng.xxzx.common.consts.FrBizConst;
import fr.zng.xxzx.util.ConvertUtil;
import fr.zng.xxzx.util.StringUtil;


public class CommUtil {
    /**
     * 日誌
     */
    private static Logger logger = Logger.getLogger(CommUtil.class);


    /**
     * @param length
     * @param sp13
     * @return
     */
    public static String makeEncrypt(int length, int sp13) {

        String encrypt = StringUtil.padLeft(String.format("%x", (length / 2 + sp13)), 4,
            '0');
        return encrypt;
    }

    

    /**
     * 异或检查
     * @param recData
     * @return
     */
    public static boolean CheckXor(String recData) {

        int i = 0;

        int tempb = 0;
        int tempc = 0;
        // 字符转为byte
        while (true) {

            if (recData.length() == (i + 2)) {
                break;
            }
            tempc = Integer.parseInt(recData.substring(i, i + 2), 16);

            if (i == 0) {
                tempb = tempc;
            } else {
                tempb = (tempb ^ tempc);

            }

            i = i + 2;

            if ((i > recData.length())) {
                break;
            }

        }
        int len = recData.length();
        if (tempb == Integer.parseInt(recData.substring(len - 2, len), 16)) {
            return true;
        }
        return false;
    }

    /** 
     * CRC-CCITT(XModem) 
     * CRC-CCITT(0xFFFF)   
     * CRC-CCITT(0x1D0F)  
     * 校验模式 
     * @param flag< XModem(flag=1) 0xFFFF(flag=2) 0x1D0F(flag=3)> 
     * @param str 
     * @return 
     */
    public static String  CRC_CCITT( int flag,String recData) {
    	int len = recData.length();
        int crc = 0x00;          // initial value  
//        int polynomial = 0x1021;
        int polynomial = 0xa001;
        String str = recData.substring(2, len - 4);
        System.out.println(str);
        byte[] bytes=str.getBytes();  
          
        switch(flag){  
        case 1:  
            crc=0x00;  
            break;  
        case 2:  
            crc=0xFFFF;  
            break;  
        case 3:  
            crc=0x1D0F;  
            break;  
          
        }  
        for (int index = 0 ; index< bytes.length; index++) {  
            byte b = bytes[index];  
            for (int i = 0; i < 8; i++) {  
                boolean bit = ((b   >> (7-i) & 1) == 1);  
                boolean c15 = ((crc >> 15    & 1) == 1);  
                crc <<= 1;  
                if (c15 ^ bit) crc ^= polynomial;  
             }  
        }  
        crc &= 0xffff;  
        str = Integer.toHexString(crc);  
        return str;  
          
    }  

    public static String getReplayLen(int len) {

        String tmp = Integer.toHexString(len / 2);
        String ret = "";
        int le = tmp.length();
        if (tmp.length() < 4) {
            for (int i = 0; i < 4 - le; i++) {
                ret = ret + "0";
            }
            ret = ret + tmp;
        } else {
            ret = tmp;
        }
        return ret;
    }
    
    /**
     * 
     * @param recData
     * @return
     */
    public static String makeXor(String recData) {
    	
    	return recData + getXor(recData);
    }


    /**
     * 异或检查
     * @param recData
     * @return
     */
    public static String getXor(String recData) {

        int i = 0;

        int tempb = 0;
        int tempc = 0;
        // 字符转为byte
        while (true) {

            if (recData.length() == (i)) {
                break;
            }
            tempc = Integer.parseInt(recData.substring(i, i + 2), 16);

            if (i == 0) {
                tempb = tempc;
            } else {
                tempb = (tempb ^ tempc);

            }

            i = i + 2;

            if ((i > recData.length())) {
                break;
            }

        }
        String ret = Integer.toHexString(tempb);
        if (ret.length() == 1) {
            return "0" + ret;
        } else if (ret.length() == 0) {
            return "00";
        }

        return ret;
    }

    /**
     * 转义数据
     * @param data
     */
    public static HashSet<String> Escape(String data) {

        String StrData = "";
        int i = 0;
        int j = 0;
        int b = 0;
        HashSet<String> ret = new HashSet<String>();

        while (true) {
            j = data.indexOf(FrBizConst.MKEY, i + 2);
            if (j <= 0) {
                break;
            }
            if (j % 2 == 0) {
                StrData = data.substring(b, j + 2);

                // "7D02"转成FrCardConst.MKEY
                StrData = doDecodeData(StrData);
                ret.add(StrData);
                j = j + 2;
                b = j;
            }

            i = data.indexOf(FrBizConst.MKEY, j);
            if (i == data.length() || i <= 0) {
                break;
            }
        }

        return ret;
    }

    /**
     *  数据替换 7D02 -> 7E 7D01 -> 7D
     * @param data
     * @return
     */
    public static String doDecodeData(String data) {
        int i = 0;
        String ret = "";
        String tmp1 = "";
        String tmp2 = "";
        String tmp = "";
        int len = data.length();
        while (true) {
            if (StringUtil.isEmpty(tmp1) && StringUtil.isEmpty(tmp2)) {
                tmp1 = data.substring(i, i + 2);
            } else {
                tmp2 = data.substring(i, i + 2);
            }

            tmp = tmp1 + tmp2;
            if (tmp.length() == 4) {
                if (tmp.toUpperCase().equals(FrBizConst.E7D)) {
                    ret += FrBizConst.M7D;
                    tmp1 = "";
                    tmp2 = "";

                } else if (tmp.toUpperCase().equals(FrBizConst.E7E)) {
                    ret += FrBizConst.MKEY;
                    tmp1 = "";
                    tmp2 = "";

                } else {
                    ret += tmp1;
                    tmp1 = tmp2;
                    tmp2 = "";
                }

            }

            if (i + 2 == len) {
                ret += tmp1;
                break;
            }

            i += 2;

        }

        return ret;
    }

    /**
     * 数据替换 7E -> 7D02 7D -> 7D01
     * @param data
     * @return
     */
    public static String doEncodeData(String data) {
        String temp = "";
        String ret = "";
        int i = 0;
        int len = data.length();
        while (true) {
            if (len <= i) {
                break;
            }
            temp = data.substring(i, i + 2);

            if (FrBizConst.MKEY.equals(temp.toUpperCase())) {
                ret += FrBizConst.E7E;
            } else if (FrBizConst.M7D.equals(temp.toUpperCase())) {
                ret += FrBizConst.E7D;

            } else {
                ret += temp;

            }
            i += 2;
        }
        return ret;
    }

    public static void main(String[] arg) {
//        System.out.println(doGetBigDecimal(Integer.parseInt("000006")));
//        int sp13 = 1 << 13;
//        System.out.println(makeEncrypt(72, sp13));
//        System.out.println(4^4);
    	System.out.println(doDecodeData("2001010865501040494610155496165993A66CB083B7EB1C103B7E0000B5"));
    	System.out.println(doEncodeData("2001010865501040494610155496165993A66CB083B7EB1C103B7E0000B5"));
//    	System.out.println(getXor("7E0500006131802268930524BD00000000000E20170218084550000001111111111111480000000000025800000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000020170218083335000000000000000000"));;
    }

    public static String getLen(String data) {
    	
    	int len = data.length() / 2;
    	String lenstr = Integer.toString(len, 16);
    	
    	return StringUtil.padLeft(lenstr, 4, '0');
    }


    public static void doPrint(JComponent jc, String key, String data) {
        logger.info(key + ":" + data);
        if (jc instanceof JTextArea) {//+"\r\n"

            JTextArea jta = ((JTextArea) jc);
            if (jta.getText().length() > 1700) {
                jta.setText("");
            }
            jta.append(StringUtil.connectString(
                /**
                 * 前台客户端显示数据拼接
                 */
                DateUtil.getCurrentDate(DateUtil.DATE_PATTERN_8), StringUtil.COLON, key,
                data, StringUtil.LINE_SPEAR_LF));
            jta.setCaretPosition(jta.getText().length());
        }
    }
    
    public static void doPrint(String key, String data) {
        logger.info(key + ":" + data);
    }
    
    public static void changeGunStatus(JComponent jc, String gun, String status) {
        logger.info(gun + ":" + status);
        if (jc instanceof JButton) {
        	JButton jbt = ((JButton ) jc);
        		if(status == "0"){
        			jbt.setText("正常");
        			jbt.setBackground(Color.blue);
        		}else if(status == "1"){
        			jbt.setText("异常");
        			jbt.setBackground(Color.red);
        		}else if(status == "2"){
        			jbt.setText("加油中");
        			jbt.setBackground(Color.yellow);
        		}
//        	else if(gun == "01"){
//        		if(status == "0"){
//        			jButton6.setText("正常");
//        			jButton6.setBackground(Color.blue);
//        		}else if(status == "1"){
//        			jButton6.setText("异常");
//        			jButton6.setBackground(Color.red);
//        		}else if(status == "2"){
//        			jButton6.setText("加油中");
//        			jButton6.setBackground(Color.yellow);
//        		}
//        	}else if(gun == "01"){
//        		if(status == "0"){
//        			jButton7.setText("正常");
//        			jButton7.setBackground(Color.blue);
//        		}else if(status == "1"){
//        			jButton7.setText("异常");
//        			jButton7.setBackground(Color.red);
//        		}else if(status == "2"){
//        			jButton7.setText("加油中");
//        			jButton7.setBackground(Color.yellow);
//        		}
//        	}else if(gun == "01"){
//        		if(status == "0"){
//        			jButton8.setText("正常");
//        			jButton8.setBackground(Color.blue);
//        		}else if(status == "1"){
//        			jButton8.setText("异常");
//        			jButton8.setBackground(Color.red);
//        		}else if(status == "2"){
//        			jButton8.setText("加油中");
//        			jButton8.setBackground(Color.yellow);
//        		}
//        	}
//            if (jbt.getText().length() > 10240) {
//            	jbt.setText("");
//            }
//            jbt.append(StringUtil.connectString(
//                DateUtil.getCurrentDate(DateUtil.DATE_PATTERN_8), StringUtil.COLON, gun,
//                status, StringUtil.LINE_SPEAR_LF));
//            jbt.setCaretPosition(jta.getText().length());
        }
    }
    
    /**
     * 
     * @param data
     */
    public static BigDecimal doGetBigDecimal(int tmp) {
    	int quyu = tmp % 100;
    	int quzheng = tmp / 100;
    	if (quyu > 9) {
    		return new BigDecimal(quzheng + "." + quyu);
    	} else {
    		return new BigDecimal(quzheng + ".0" + quyu);
    	}
    	
    }
    
    /**
	 * @功能: BCD码转为10进制串(阿拉伯数据)
	 * @参数: BCD码
	 * @结果: 10进制串
	 */
	public static String bcd2Str(byte[] bytes) {
		StringBuffer temp = new StringBuffer(bytes.length * 2);
		for (int i = 0; i < bytes.length; i++) {
			temp.append((byte) ((bytes[i] & 0xf0) >>> 4));
			temp.append((byte) (bytes[i] & 0x0f));
		}
		return temp.toString().substring(0, 1).equalsIgnoreCase("0") ? temp
				.toString().substring(1) : temp.toString();
	}
 
	/**
	 * @功能: 10进制串转为BCD码
	 * @参数: 10进制串
	 * @结果: BCD码
	 */
	public static byte[] str2Bcd(String asc) {
		int len = asc.length();
		int mod = len % 2;
		if (mod != 0) {
			asc = "0" + asc;
			len = asc.length();
		}
		byte abt[] = new byte[len];
		if (len >= 2) {
			len = len / 2;
		}
		byte bbt[] = new byte[len];
		abt = asc.getBytes();
		int j, k;
		for (int p = 0; p < asc.length() / 2; p++) {
			if ((abt[2 * p] >= '0') && (abt[2 * p] <= '9')) {
				j = abt[2 * p] - '0';
			} else if ((abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) {
				j = abt[2 * p] - 'a' + 0x0a;
			} else {
				j = abt[2 * p] - 'A' + 0x0a;
			}
			if ((abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) {
				k = abt[2 * p + 1] - '0';
			} else if ((abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) {
				k = abt[2 * p + 1] - 'a' + 0x0a;
			} else {
				k = abt[2 * p + 1] - 'A' + 0x0a;
			}
			int a = (j << 4) + k;
			byte b = (byte) a;
			bbt[p] = b;
		}
		return bbt;
	}
    
    public static void main1(String[] arg) {
    	
    }

    /**
     * @param msg
     * @param socket
     * @throws IOException
     */
    public static void doPrintSocket(String msg, Socket socket) throws IOException {
        // msg = ConvertUtil.toStringHex3(msg);
        DataOutputStream pw = new DataOutputStream(socket.getOutputStream());
        pw.write(ConvertUtil.HexStrToAscii(msg));
        pw.flush();
    }
    
    
    /**
     * 异或检查(云南瑞燃)
     * @param data
     * @return
     */
	public static boolean ynrrCheckXor(String data) {
		String recData = data.substring(2,16);
		System.out.println(recData);
		String checkdata = data.substring(16, 18);
		System.out.println(checkdata);
		
		String xor = CommUtil.getXor(recData);
		if(checkdata.equals(xor)){
			return true;
		}
		return false;
	}
	
	public static boolean qbbCheckXor(String data) {
		String recData = data.substring(0,6);
		if("01041a".equals(recData)){
			return true;
		}
		return false;
	}

	public static String createUuid() {
	    return UUID.randomUUID().toString().replace("-", "");
	}


	/**
	 * 组织发送的数据 order:消息id device：设备号 serial：原流水号
	 */
	public static String doMakeData(String order,String version, String device, String time, String enTime, String info) {
		// 消息id + 版本号 + 设备号 + 时间戳 + 秘钥+ 消息体
		String ret = order + version + device + time + enTime + info;
		// 异或值 从消息ID第1个字节开始异或校验直到效验码前1个字节校验码用1字节表示。
		String xor = CommUtil.getXor(ret);
		ret = ret + xor;
		// 数据转义
		ret = CommUtil.doEncodeData(ret);
		// 拼接 标识符
		return StringUtil.connectString(FrBizConst.MKEY, ret, FrBizConst.MKEY);
	}
	/**
	 * 组织发送的数据 order:消息id device：设备号 serial：原流水号
	 */
	public static String doMakeData2(String order,String version, String device, String time, String enTime, String info) {
		// 消息id + 版本号 + 设备号 + 时间戳 + 秘钥+ 消息体
		String ret = order + version + device + time + enTime + info;
		// 异或值 从消息ID第1个字节开始异或校验直到效验码前1个字节校验码用1字节表示。
		String xor = CommUtil.getXor(ret);
		ret = ret + xor;
		// 数据转义
		ret = CommUtil.doEncodeData(ret);
		// 拼接 标识符
		return StringUtil.connectString(FrBizConst.MKEY, ret, FrBizConst.MKEY);
	}
	/**
	 * asiic码转string
	 * */
	public static String doAscTowb(String s){
		StringBuffer buffer = new StringBuffer();
		int n = s.length();
		for(int i = 0; i < n; i++){
			// 因为索引是从0开始，所以索引为偶数的是奇数位字符
			if(i % 2 != 0){
        buffer.append(s.charAt(i));
			}
		}
		return buffer.toString();
	}
	//String转asiic
	public static String ConvertToASCII(String str){
		StringBuffer sbu = new StringBuffer();  
	    char[] chars = str.toCharArray();   
	    for (int i = 0; i < chars.length; i++) {  
	        if(i != chars.length - 1)  
	        {  
	            sbu.append((int)chars[i]).append("0");  
	        }  
	        else {  
	            sbu.append((int)chars[i]);  
	        }  
	    }  
	    return sbu.toString();  
    }
}
