package com.netease.LDNetDiagnoUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class LDPingParse {
  public static String getFormattingStr(String host, String log) {
    StringBuilder logRes = new StringBuilder();
    if (log.contains("timeout")) {
      logRes.append("ping: cannot resolve " + host + ": Timeout");
    } else if (log.contains("unknown")) {
      logRes.append("ping: cannot resolve " + host + ": Unknown host");
    } else {
      makePingResponse(log, logRes);
    }
    return logRes.toString();
  }

  public static void makePingResponse(String log, StringBuilder logRes) {
    String hostIp = getIP(log);
    List<String> bytesList = getSumBytes(log);
    List<String> ttlList = getTTL(log);
    List<String> timeList = getTime(log);
    List<String> icmpList = getIcmp_seq(log);
    int len = timeList.size();
    for (int i = 0; i < len - 1; i++) {
      logRes.append(bytesList.get(i) + "bytes from " + hostIp + ": icmp_seq=#"
          + icmpList.get(i) + " ttl=" + ttlList.get(i) + " time="
          + timeList.get(i) + "ms" + "\n");
    }
    logRes.append(bytesList.get(len - 1) + "bytes from " + hostIp
        + ": icmp_seq=#" + icmpList.get(len - 1) + " ttl="
        + ttlList.get(len - 1) + " time=" + timeList.get(len - 1) + "ms");
  }

  private static List<String> getTime(String log) {
    List<String> timeList = new ArrayList<String>();
    String regex = "(?<==)([\\.0-9\\s]+)(?=ms)";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(log);
    while (m.find()) {
      timeList.add(m.group().toString().trim());
    }
    return timeList;
  }

  private static List<String> getSumBytes(String log) {
    List<String> bytesList = new ArrayList<String>();
    String regex = "(?<=\\D)([\\s0-9]+)(?=bytes)";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(log);
    while (m.find()) {
      String string = m.group().toString().trim();
      if (m.group().toString().trim().matches("\\d+")) {
        bytesList.add(string);
      }
    }
    return bytesList;
  }

  private static List<String> getTTL(String log) {
    List<String> ttlList = new ArrayList<String>();
    String regex = "(?<=ttl=)([0-9]+)(?=\\s)";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(log);
    while (m.find()) {
      String tmp = m.group().toString().trim();
      ttlList.add(tmp);
    }
    return ttlList;
  }

  private static String getIP(String log) {
    String hostIp = null;
    String regex = "(?<=\\()([\\d]+\\.)+[\\d]+(?=\\))";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(log);
    while (m.find()) {
      hostIp = m.group().toString().trim();
    }
    return hostIp;
  }

  private static List<String> getIcmp_seq(String log) {
    List<String> icmpList = new ArrayList<String>();
    String regex = "(?<=icmp_seq=)([0-9]+)(?=\\s)";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(log);
    while (m.find()) {
      String tmp = m.group().toString().trim();
      icmpList.add(tmp);
    }
    return icmpList;
  }
}
