/*
 Provede ping
 */
package octantKlient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Filip Dvorak
 */
class Ping {
//vykona ping a ulozi do do promenne posledniradek ziskana zpozdeni

    public static Double ping(String ipAdresa) throws IOException {
        //vykona prikaz ping se zadanymi parametry
        ProcessBuilder prikaz = new ProcessBuilder("ping", "-q", "-c", "10", ipAdresa);
        Process vykonejPrikaz = prikaz.start();

        //ulozi do pameti vystupy prikazu ping
        BufferedReader zachytavac = new BufferedReader(new InputStreamReader(vykonejPrikaz.getInputStream()));
        String posledniradek = null;
        String radek = null;

        //ulozi posledni radek z vystupu programu ping
        while ((radek = zachytavac.readLine()) != null) {
            posledniradek = radek;
        }

        Double minimalniZpozdeni = najdiminimalniZpozdeni(posledniradek);
        return minimalniZpozdeni;
    }

//najde minimalni hodnotu z ping (z tech vsech trech zmerenych hodnot - max,min apod)
    private static Double najdiminimalniZpozdeni(String posledniradek) {

        // pomoci reg. vyrazu ziska hodnotu minimalniho zpozdeni
        Pattern vzorek = Pattern.compile(".*\\=(.*)/(.*)/(.*)/(.*)\\ ms");
        Matcher srovnavac = vzorek.matcher(posledniradek);

        Double minimalniZpozdeni = 0.0;

        if (srovnavac.find()) {
            String pomocna = srovnavac.group(1);
            minimalniZpozdeni = Double.parseDouble(pomocna);
        }
        return minimalniZpozdeni;


    }

    //provede ping na uzly site PlanetLab
    public static HashMap<String, String> pozadavekNaOrienacniBod(ArrayList<String> orientacniBody, String ipAdresaCile)
            throws Exception {


        HashMap<String, String> map = new HashMap<String, String>();
        int h = 0;
        boolean cyklus = true;
        //cekej dokud nebude naplnene cele pole map (vrati se vsechny odpovedi z uzlu PlanetLab)
        while (orientacniBody.size() != map.size()) {
            if (cyklus = true) {
                for (String aktualniOb : orientacniBody) {
                    String hodnotyZpozdeni = null;
                    System.out.println("Posilam pozadavek na " + aktualniOb);
                    //proved ping na jednotlivve uzly a uloz zisakne hodnoty do pole map
                    hodnotyZpozdeni = Tcp.spojTcp(aktualniOb, ipAdresaCile);
                    map.put(aktualniOb, hodnotyZpozdeni);
                    //System.out.println("Od uzlu " + orientacniBod.toString() + " obdrzena hodnota " + hodnotyZpozdeni.toString());
                }
                cyklus = false;
            }

        }


        return map;
    }
}
