/*
 Formát vstupnich dat
 */
package octantKlient;

import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 *
 * @author FilipDvorak
 */
public class VstupniData {

    //fce nacte data ve formatu JSON a presune je do dynamickeho pole
    public static ArrayList<OrientacniBod> vytvorPoleOrientacnichBodu(JSONArray jsonPlanetLabsUzly) throws JSONException {

        Log.zapisDoLogu("Spustim fci vytvorPoleOrientacnichBodu");
        ArrayList<OrientacniBod> poleOrientacnichBodu = new ArrayList<OrientacniBod>();
        //do pomocne promenne zaznam bude ukladat jeden celek tykajici se jednoho uzlu site PlanetLab (Ip adresa, poloha - zemepisna sirka a delka apod. )
        JSONObject zaznam;
        //prohledava JSON pole s informacemi o PlanetLab uzlech
        for (int i = 0; i < jsonPlanetLabsUzly.length(); i++) {
            zaznam = jsonPlanetLabsUzly.getJSONObject(i);

            //podminka kdyz bude zaznam nulovy
            if (zaznam == null) {
                continue;
            }

             
            //pokud ma promenna antiduplikator hodnotu false, tak tam nejsou stejne prvky
            boolean antiduplikator = false;
            try {
                antiduplikator = VstupniData.obsahujePoleStejnyPrvek(zaznam, poleOrientacnichBodu);
                //pokud pole OB neobsahuje stejny prvek, tak ho zapise
                if (antiduplikator == false) {
                    poleOrientacnichBodu.add(new OrientacniBod(new Souradnice(zaznam.getDouble("longitude") * 64.152, zaznam.getDouble("latitude") * 111.33), new IpAdresa(zaznam.getString("ip"))));
                    //System.out.println("Orientacni body :" + poleOrientacnichBodu.get(poleOrientacnichBodu.size() - 1).getIp().getIpAdresa().toString());

                }

            } catch (JSONException exc) {
               
                //System.out.println("Zaznam nenalezen");
                Log.zapisDoLogu(exc);
                continue;
            }


        }

        //Pro testovaci mnozinu pevne zadanych kruznic
        //A1
        //poleOrientacnichBodu.add(new OrientacniBod(new Souradnice(8.0, 8.0), new IpAdresa("1.1.1.1")));
        //A2
        //poleOrientacnichBodu.add(new OrientacniBod(new Souradnice(18.0, 13.0), new IpAdresa("2.2.2.2")));
        //A3
        //poleOrientacnichBodu.add(new OrientacniBod(new Souradnice(16.0, 4.0), new IpAdresa("3.3.3.3")));
        //poleOrientacnichBodu.add(new OrientacniBod(new Souradnice(8.0, 5.0), new IpAdresa("4.4.4.4")));
        //poleOrientacnichBodu.add(new OrientacniBod(new Souradnice(4.0, 3.0), new IpAdresa("5.5.5.5")));



        return poleOrientacnichBodu;
    }

    public static ArrayList<Kruznice> vytvorKruznice(ArrayList<OrientacniBod> poleOrientacniBodu) {

        ArrayList<Kruznice> poleKruznic = new ArrayList<Kruznice>();
        //A1-polomery - pozitivni,negativni
        poleKruznic.add(new Kruznice(poleOrientacniBodu.get(0), 7.5, 5.0));
        //A2
        poleKruznic.add(new Kruznice(poleOrientacniBodu.get(1), 7.9, 6.5));
        //A3
        poleKruznic.add(new Kruznice(poleOrientacniBodu.get(2), 3.0, 2.5));
        //poleKruznic.add(new Kruznice(poleOrientacniBodu.get(3), 3.0 , 4.0));
        //poleKruznic.add(new Kruznice(poleOrientacniBodu.get(4), 2.0 , 3.0));

        return poleKruznic;
    }

    public static ArrayList<String> vytvorPoleIpAdresOrientacnichBodu(ArrayList<OrientacniBod> poleOrientacnichBodu) {

        ArrayList<String> poleIpAdresOrientacnichBodu = new ArrayList<String>(poleOrientacnichBodu.size());
        for (OrientacniBod orientacniBod : poleOrientacnichBodu) {
            poleIpAdresOrientacnichBodu.add(orientacniBod.getIp().getIpAdresa());
        }
        return poleIpAdresOrientacnichBodu;
    }

    private static boolean obsahujePoleStejnyPrvek(JSONObject zaznam, ArrayList<OrientacniBod> poleOrientacnichBodu) {
        boolean antiduplikator = false;
        for (OrientacniBod aktualniOrientacniBod : poleOrientacnichBodu) {
            try {
                if (aktualniOrientacniBod.getSouradnice().getSouradniceX() == zaznam.getDouble("longitude") * 64.152 && zaznam.getDouble("latitude") * 111.33 == aktualniOrientacniBod.getSouradnice().getSouradniceY()) {
                    antiduplikator = true;
                    break;
                }
            } catch (JSONException ex) {
                Log.zapisDoLogu(ex);
            }
        }
        return antiduplikator;
    }

    public static JSONArray jeCilAktivni(JSONArray jsonPoleCilu) {

        //1. nejprve zjisti IP adresy cilu u ulozi je do pole  
        //2. pokud je zpozdeni vetsi nez 0.0 ---> je uzel aktivni
        //3. aktivni uzel je zapsan do pole jsonPoleAktivnichCilu

        Log.zapisDoLogu("Funkce spustena - zjistuji zda je cil aktivni");
        Log.zapisDoLogu(jsonPoleCilu.toString());
        JSONArray jsonPoleAktivnichCilu = new JSONArray();
        JSONObject zaznam = null;
        ArrayList<String> poleIPAdresCilu = new ArrayList<String>();
        //prohledava JSON pole s informacemi o IP adresach cilu a uklada je do pole poleIPAdresCilu
        for (int i = 0; i < jsonPoleCilu.length(); i++) {
            try {
                zaznam = jsonPoleCilu.getJSONObject(i);
                poleIPAdresCilu.add(zaznam.getString("ip"));
                //nasleduje ping na cil
                Double zpozdeni;
                try {
                    //pokud je zpozdeni vetsi nez nula tak se zaznam zapise do pole JSON
                    zpozdeni = Ping.ping(poleIPAdresCilu.get(i));
                    if (zpozdeni > 0.0) {
                        jsonPoleAktivnichCilu.put(jsonPoleCilu.getJSONObject(i));
                    }else
                    {
                        Soubory.nedostupnyCil(poleIPAdresCilu.get(i));
                    }

                } catch (IOException ex) {
                    Log.zapisDoLogu("Nepodaril se ping na cil!");
                  //System.out.println("Nepodaril se ping na cil!");
                    
                }
              

            } catch (JSONException ex) {
                Log.zapisDoLogu(ex);
                Log.zapisDoLogu("Nepodaril se ping na cil!");

            }

        }
        return jsonPoleAktivnichCilu;
    }

    public static JSONArray nactiJson(String string) {

        JSONArray jsonPlanetLabsUzly = null;
        try {
            jsonPlanetLabsUzly = new JSONArray(string);
            Log.zapisDoLogu(jsonPlanetLabsUzly.toString());
        } catch (JSONException ex) {
            Log.zapisDoLogu(ex);
        }
        return jsonPlanetLabsUzly;
    }

    public static JSONArray nactiJsonCilu(String string) {

        JSONArray jsonPoleCilu = null;

        try {
            //nacteni IP adresy cile
            jsonPoleCilu = new JSONArray(string);
            Log.zapisDoLogu(jsonPoleCilu.toString());
            Log.zapisDoLogu("Pole cilu je" + jsonPoleCilu.length());
        } catch (JSONException ex) {
            Logger.getLogger(Octant.class.getName()).log(Level.SEVERE, null, ex);
            Log.zapisDoLogu(ex);
        }
        return jsonPoleCilu;
    }
}
