/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vypocetObalky;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 *
 * @author Filip Dvorak
 */
class VstupniData {

   
    public static String najdiMojiIP() throws IOException {
        // System.out.println("IP adresu zjistuji");
        //vytvoreni procesu v Bashi    
        ProcessBuilder prikaz = new ProcessBuilder("/sbin/ifconfig", "eth0");
        //zde se nastartuje prikaz (viz vyse)
        Process vykonejPrikaz = prikaz.start();
        //ulozi vystup z programu ifconfigu
        BufferedReader zachytavac = new BufferedReader(new InputStreamReader(vykonejPrikaz.getInputStream()));

        //ulozi do promenne druhyRadek druhy radek z vystupu ifconfig ---- zde se nachazi hledana IP adresa
        String druhyRadek = null;
        String radek = null;
        for (int i = 0; i < 2; i++) {
            radek = zachytavac.readLine();
            druhyRadek = radek;
        }
        // fce vytahne IP adresu a ulozi do promenne string
        String ip = vytahniIPAdresu(druhyRadek);

        return ip;
    }

    //ziska IP adresu z ifconfig
    private static String vytahniIPAdresu(String druhyRadek) {

        //pomoci regurelniho vyrazu se ziska IP adresa
        Pattern vzorek = Pattern.compile(".*inet addr\\:(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}).*");
        //z radku ziskaneho z programu ifconfig
        Matcher srovnavac = vzorek.matcher(druhyRadek);

        String ip = null;
        if (srovnavac.find()) {
            ip = srovnavac.group(1);
        }
        System.out.println("Moje IP je :" + ip);
        return ip;
    }
    //funkce pro nacteni uzlu ze souboru a ulozeni do pole
    public static ArrayList<OrientacniBod> vytvorOrienatcniBodyZeSouboru() throws FileNotFoundException, IOException, JSONException {

        ArrayList<OrientacniBod> uzlyPlanetLab = new ArrayList<OrientacniBod>();
        
        //pro TEST na lokalnim PC
        BufferedReader uzlyVBufferu = new BufferedReader(new FileReader("landmarks30.txt"));
        //BufferedReader uzlyVBufferu = new BufferedReader(new FileReader("landmarks10.txt"));
        
        //pro test na SERVER 
        //BufferedReader uzlyVBufferu = new BufferedReader(new FileReader("/home/cesnet_vutbr2/xdvora02/landmarks.txt"));
        //Objekt na seskladavani stringu
        StringBuilder slozString = new StringBuilder();

        String radek = null;
        //podminka - uloz vse do promenn slozString
        while ((radek = uzlyVBufferu.readLine()) != null) {
            slozString.append(radek);
        }
        //skoncil kod pro nacteni ze souboru a ulozeni (format JSON zachovan) do promenne slozString

        JSONArray jsonPlanetLabsUzly = new JSONArray(slozString.toString());

        JSONObject zaznam;
        //projizdime JSON pole s informacemi o PlanetLab uzlech - zaznam je jeden objekt JSON pole
        for (int i = 0; i < jsonPlanetLabsUzly.length(); i++) {
            zaznam = jsonPlanetLabsUzly.getJSONObject(i);

            //podminka kdyz bude zaznam nulovy
            if (zaznam == null) {
                continue;
            }
            //ulozi do pole uzlyPlanetLab(typ Pole orientacnich bodu) -----souradnice a IP adresu
            try {
                uzlyPlanetLab.add(new OrientacniBod(new Souradnice(zaznam.getDouble("latitude"), zaznam.getDouble("longitude")), new IpAdresa(zaznam.getString("ip"))));
                // System.out.println("uzlyPlanetLab" + uzlyPlanetLab.get(i).getSouradnice().getSouradniceX());
                // System.out.println("uzlyPlanetLab" + uzlyPlanetLab.get(i).getSouradnice().getSouradniceY());
            } catch (JSONException exc) {
                System.out.println("Zaznam v JSON poli nenelezen");
                continue;
            }

        }

        return uzlyPlanetLab;
    }

    //z pole uzlyPlanetLabu najde ten na kterem je program nahran a smaze ho z tohoto pole, na ti ostani ja pak proveden ping 
    public static OrientacniBod najdiAktualniPolohuOrientacnihoBodu(String mojeIPAdresa, ArrayList<OrientacniBod> uzlyPlanetLab) {
        OrientacniBod aktualniOrientacniBod = null;
        System.out.println("Hledam v poli tuto adresu:" + mojeIPAdresa.toString());
        //System.out.println("aktualniOrientacniBod");
        for (OrientacniBod orientacniBod : uzlyPlanetLab) {
            if (orientacniBod.getIp().getIpAdresa().equals(mojeIPAdresa)) {
                //System.out.println("aktualniOrientacniBod" + orientacniBod.getIp().getIpAdresa().toString());
                aktualniOrientacniBod = new OrientacniBod(orientacniBod.getSouradnice(), orientacniBod.getIp());
                //System.out.println("aktualniOrientacniBod nenalezen");
                System.out.println("Aktualni bod v poli ma souradnice " + aktualniOrientacniBod.getSouradnice().getSouradniceX());
                System.out.println("Aktualni bod v poli ma souradnice " + aktualniOrientacniBod.getSouradnice().getSouradniceY());
                System.out.println("Aktualni bod v poli ma IP " + aktualniOrientacniBod.getIp().getIpAdresa().toString());
                Log.zapisDoLogu("Aktualni bod v poli ma IP " + aktualniOrientacniBod.getIp().getIpAdresa().toString());
                uzlyPlanetLab.remove(orientacniBod);
                break;
            } else {
                System.out.println("aktualniOrientacniBod nenalezen");
                continue;
            }
        }
        //System.out.println("aktualniOB : " + aktualniOrientacniBod.getSouradnice().getSouradniceX());
        //System.out.println("aktualniOB : " + aktualniOrientacniBod.getSouradnice().getSouradniceY());
        return aktualniOrientacniBod;
    }

    //provede ping k ostatnim orientacnim bodum z pole uzlyPlanetLab a vrati pole s hodnotami zpozdeni
    public static ArrayList<ZpozdeniKOrientacnimuBodu> najdiZpozdeniKOrientacnimBodum(ArrayList<OrientacniBod> uzlyPlanetLab) throws IOException {
        ArrayList<ZpozdeniKOrientacnimuBodu> zpozdeniKOrientacnimBodum = new ArrayList<ZpozdeniKOrientacnimuBodu>();
        int i = 0;
        for (OrientacniBod orientacniBod : uzlyPlanetLab) {
            //provede ping a nasledne priradi zpozdeni k OB
            zpozdeniKOrientacnimBodum.add(new ZpozdeniKOrientacnimuBodu(Ping.ping(orientacniBod.getIp().getIpAdresa()), orientacniBod));

            i++;
         //System.out.print(i);
         //System.out.println(" Orientacni bod : " + orientacniBod.getIp().getIpAdresa().toString());
         //System.out.println("zpozdeni" + zpozdeniKOrientacnimBodum.get(i).toString());

        }

        return zpozdeniKOrientacnimBodum;
    }
}
