

package com.fr.tx.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 java.util.regex.Pattern;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JTextArea;

import org.apache.log4j.Logger;

import com.fr.tx.common.consts.FrBizConst;	


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;
    }



    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);
//        HashSet<String> set = EscapeFa("FA00005E0013FAFA02010000016800005A01908377");
//    	System.out.println(set.toString());
    	System.out.println(getXor("2F71303000"));
    }

    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() > 10240) {
                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());
            //jta.paintImmediately(jta.getBounds());

        }
    }
    
   
    
    public static void doPrint(String key, String data) {
        logger.info(key + ":" + data);
    }
    
    
    public static void doPrintErr(JComponent jc, String key, String data) {
        logger.info(key + ":" + data);
        if (jc instanceof JTextArea) {//+"\r\n"

            JTextArea jta = ((JTextArea) jc);
            if (jta.getText().length() > 10240) {
                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 doPrintErr(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);
    	}
    	
    }
    
    /**
     * 转义数据
     * @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;
    }
    
    /**
     * 转义数据
     * @param data
     */
    public static HashSet<String> EscapeFa(String data) {

        String StrData = "";
        int i = 0;
        int j = 0;
        int b = 0;
        
        
        HashSet<String> ret = new HashSet<String>();
        
        
        data = doDecodeDataFa(data);
        while (true) {
            j = data.indexOf(FrBizConst.MFA, i + 2);
            if (j < 0) {
                if (i == 0) {
                    ret.add(data);
                    break;
                } else {
                    j = data.length();
                }
            } 
            if (j % 2 == 0) {
                StrData = data.substring(b, j);

                ret.add(StrData);
                b = j;
            }

            i = data.indexOf(FrBizConst.MFA, j);
            if (i == data.length() || i <= 0) {
                break;
            }
        }

        return ret;
    }

    /**
     * 数据替换
     * @param data
     * @return
     */
    private 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;
    }
    /**
     * 数据替换
     * @param data
     * @return
     */
    public static String doDecodeDataFa(String data) {
        int i = 0;
        String ret = "";
        String tmp = "";
        String tmp1 = "";
        String tmp2 = "";
        if (StringUtil.isEmpty(data)) {
            return "";
        }
        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.MFAFA)) {
                    ret += FrBizConst.MFA;
                    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 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("-", "");
	}
	
	public static String getFree(float fee) {
        String strFree = String.valueOf(fee);
        int index = strFree.indexOf(".");
        if (index < 0) {
            strFree = strFree + ".00";
            strFree = StringUtil.padLeft(strFree, 7, '0');
            return strFree;
        } else {
            if (index == strFree.length()-2) {
                strFree = strFree + "0";
                strFree = StringUtil.padLeft(strFree, 7, '0');
            } else {
                strFree = StringUtil.padLeft(strFree, 7, '0');
            }
            return strFree;
        }
    }
	
	/**
	 * Ip地址判断<br>
	 * 符号 '\d'等价的正则表达式'[0-9]',匹配数字0-9<br>
	 * {1,3}表示匹配三位以内的数字（包括三位数）
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isIP(String str) {
 
		// 匹配 1
		// String regex = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";
		// 匹配 2
		String regex = "[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}";
 
		// 匹配1 和匹配2均可实现Ip判断的效果
		Pattern pattern = Pattern.compile(regex);
 
		return pattern.matcher(str).matches();
 
	}
}
