package javademo.jni;
import java.io.*;
import java.net.*;
import java.util.regex.*;


public class SimpleServerThread extends Thread {
    private Socket socket;
    private AdemcoHbLibrary lib;
    private long lastTimeStatusChange = 0;
 
    public SimpleServerThread(Socket socket, AdemcoHbLibrary lib) {
        this.socket = socket;
        this.lib = lib;
    }

    /**
	 * 16进制表示的字符串转换为字节数组
	 *
	 * @param s 16进制表示的字符串
	 * @return byte[] 字节数组
	 */
	public static byte[] hexStringToByteArray(String s) {
	    int len = s.length();
	    byte[] b = new byte[len / 2];
	    for (int i = 0; i < len; i += 2) {
	        // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
	        b[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character
	                .digit(s.charAt(i + 1), 16));
	    }
	    return b;
    }
    

    public static String printable_bytes(byte[] b){
        String HEX_STRING = "0123456789ABCDEF";
        String s = "";
        for(int i = 0; i < b.length; i++){
            byte c = b[i];
            if(32 <= c && c <= 127){
                s += (char)c;
            }else{
                s += "\\x" + HEX_STRING.charAt(b[i] >>> 4);
                s += HEX_STRING.charAt(b[i] & 0x0F);
            }
        }
        return s;
    }

 
    public void run() {
        try {
            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
 
            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);
 
 
            String line;
            // 创建 Pattern 对象
            String pattern1 = "\"(.+)\"(\\d{4}).+\\#(.+)\\[";
            Pattern r1 = Pattern.compile(pattern1);
            String pattern2 = "\\[\\#([\\d\\|a-fA-F]{6})\\|(\\d{4})\\s(\\d{2})\\s(\\d{3})\\]";
            Pattern r2 = Pattern.compile(pattern2);

            while(true){
                line = reader.readLine();
                if(line==null)continue;
                System.out.println(line);
                
                // 现在创建 matcher 对象
                Matcher m = r1.matcher(line);
                if (m.find()) {
                    String id = m.group(1);
                    int seq = Integer.parseInt(m.group(2));
                    String acct = m.group(3);
                    System.out.println("Found id: " + id);
                    System.out.println("Found seq: " + seq);
                    System.out.println("Found acct: " + acct); 

                    switch(id){
                        case "ACK":break;
                        case "NULL": // reply ack
                        {
                            String ack = lib.packAck(seq, acct);
                            System.out.println("replying ack:" + ack);
                            writer.write(ack);
                            writer.flush();
                            break;
                        }
                        case "HENG-BO":
                        case "ADM-CID":
                        {
                            // reply ack
                            String ack = lib.packAck(seq, acct);
                            System.out.println("replying ack:" + ack);
                            writer.write(ack);
                            writer.flush();

                            // handle event
                            m = r2.matcher(line);
                            if (m.find()) {
                                int ademco_id16 = Integer.parseInt(m.group(1), 16);
                                int ademco_event = Integer.parseInt(m.group(2));
                                int gg = Integer.parseInt(m.group(3));
                                int zone = Integer.parseInt(m.group(4));
                                System.out.println("Found ademco_event: " + ademco_event);
                                System.out.println("Found gg: " + gg);
                                System.out.println("Found zone: " + zone); 

                                // 主机状态改变间隔超过5秒,则触发一次远程控制命令发送给主机
                                if(ademco_event == 3400 || ademco_event == 1400){
                                    long now = System.currentTimeMillis();
                                    if(now - lastTimeStatusChange > 5000){
                                        lastTimeStatusChange = now;
                                        if(ademco_event == 3400){ // 布防则发撤防命令
                                            String cmd = lib.pack2(seq+1, acct, ademco_id16, 1400, 0, 0, "123456");
                                            byte[] data = hexStringToByteArray(cmd);
                                            System.out.println("sending 1400 command:" + printable_bytes(data));
                                            output.write(data);
                                            output.flush();
                                        }else{ // 撤防就发布防命令
                                            String cmd = lib.pack(seq+1, acct, ademco_id16, 3400, 0, 0);
                                            System.out.println("sending 3400 command:" + cmd);
                                            writer.write(ack);
                                            writer.flush();
                                        }
                                        
                                        
                                    }
                                }
                            }else{
                                System.out.println("r2 NO MATCH");
                            }
                            
                            break;
                        }
                    
                    }
                } else {
                    System.out.println("r1 NO MATCH");
                }
            }
 
        } catch (IOException ex) {
            System.out.println("Server exception: " + ex.getMessage());
            ex.printStackTrace();
        }
    }
}