/*
 Hlavní část programu, ze které se spouští funkce najdi polohu a nacitaji vstupni data
 

1.nacti orientacni body a cile ze souboru
2.zjisti zda je cil aktivni (odpovida na ICMP dotaz)
3.posli Ip adresu cile na orientacni uzly programu TCPServer.jar a cekej na odpoved
4.prichozi hodnotu zkontroluj zda neni nulova a uloz do pole
5.prirad kazde hodnote IP adresu OB od kterho zpozdeni prislo
6.z techoto hodnot vytvor hranice omezeni - tzn. mezikruzi
7.rozdel mezikruzi novou kruznici
8.vypocti pruseciky techto novych kruznic
9.duplicitni prvky vymaz
10.vymaz pruseciky nachazejici se mimo mezikruzi vsech kruznic
11.vymez oblast mezi pruseciky mnohouhelnikem a vypocti jeho teziste
12.bod urcujici teziste je zaroven i cilovy bod
13. vypis jeho souradnice 

* Zakomentovane radky s napisem TEST slouzi pro otestovani programu na lokalnim pocitaci
* V pripade ze je program nahran na skolnim serveru je nutno zakomentovat  vsechny vypisi do konzole
* Zakomentovane radky se slovem SERVER slouzi pro otestovani programu na skolnim serveru
* 
* Program je nastaven na spusteni na lokalnim PC a nacteni potrebnych udaju ze souboru v adresari, kde je program ulozen
* V pripade nasazeni na server je nutno odkomentovat radek pod slovem SERVER
   a zakomentovat radek pod slovem TEST a naopak
*/
package octantKlient;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.json.JSONArray;
import org.json.JSONException;

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

    public static void main(String[] args) {

       
        //smazani log souboru
        Log.smazSouborLog();
        Log.zapisDoLogu("Log smazan");

        
          //zacatek nacitani dat(OB a cilu) ve formatu JSON - slouzi pro beh na SERVERu
          Log.zapisDoLogu("Zacinam nacitat JSON");

        //nacteni JSON pole planetLab uzlu a cilu z weboveho serveru
        //pokud je program na skolnim serveru musi byt nasledujici radky odkomentovane
        //JSONArray jsonPlanetLabsUzly = VstupniData.nactiJson(args[1]);
        //JSONArray jsonPoleCilu = VstupniData.nactiJsonCilu(args[0]);

         //konec nacitani dat(OB a cilu) ve formatu JSON - slouzi pro beh na SERVERu


        //nacteni ze souboru - jen pro testovani na lokalnim PC - TEST
        //slouzi pro nacteni OB a cilu ze souboru k testovacim ucelum

        try {
            BufferedReader br = new BufferedReader(new FileReader("targets1.txt")); //vytvori retezec JSON 
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }

            JSONArray jsonPoleCilu = new JSONArray(sb.toString());


            //pro nacteni orientacnich bodu ze souboru 
            BufferedReader br1 = new BufferedReader(new FileReader("referencniOB.txt"));
            StringBuilder sb1 = new StringBuilder();
            String line1 = null;
            while ((line1 = br1.readLine()) != null) {
                sb1.append(line1);
            }
            JSONArray jsonPlanetLabsUzly = new JSONArray(sb1.toString());
           //konec nacitani ze souboru - jen pro testovani na lokalnim PC!!!


            //vytvoreno pole ze zadanych udaju (z pole jsonPlanetLabsUzly) ve formatu souradnice a IP adresy planetLab uzlu
            ArrayList< OrientacniBod> orientacniBodyNove = null;
            try {
                Log.zapisDoLogu("Spustim funkci vytvorPoleOrientacnichBodu");
                orientacniBodyNove = VstupniData.vytvorPoleOrientacnichBodu(jsonPlanetLabsUzly);
                System.out.println("Pocet orientacnich bodu je: " + orientacniBodyNove.size());
                Log.zapisDoLogu("Pocet orientacnich bodu je: " + orientacniBodyNove.size());

            } catch (JSONException ex1) {
                Log.zapisDoLogu("Nepodarilo se vytvorit pole orientacnich uzlu");
                Log.zapisDoLogu(ex1);
            }
            Log.zapisDoLogu("Poustim funkci pro overeni zda je cilovy uzel aktivni");
            Log.zapisDoLogu("Pocet aktivnich cilu pred kontrolou je :" + jsonPoleCilu.length());
            
            //fce overi zda je na cil aktivni - odpovida na ping
            jsonPoleCilu = VstupniData.jeCilAktivni(jsonPoleCilu);

            //pokud bude pole cilu nulove prerus program
            if(jsonPoleCilu.length() == 0)
            {
            Log.zapisDoLogu("Cilove body neodpovidaji na ping - prerusuji program");    
            return;
            }
            
            Log.zapisDoLogu("Pocet aktivnich cilu je :" + jsonPoleCilu.length());
            Log.zapisDoLogu(jsonPoleCilu.toString()); 
            
            //funkce spocita polohy cile  - metoda vrati JSON pole - souradnice ciloveho bodu, dobu vypoctu a obsah oblasti kde se cilovy bod nachazi s urcitou pravdepodobnosti
            jsonPoleCilu = VystupniData.spocitejPolohyCilu(orientacniBodyNove, jsonPoleCilu);



            //fce vypocita chybu --- vzdalenost urcenych a odhadnutych souradnic cile - musi se zadad seznam se spravnymi souradnicemi
            //souradnice zname - longitude:X a latitude:Y
            //Prusecik znameSouradnice =  new Prusecik(new Souradnice(8.54854, 47.3793))  ;

            //ArrayList<Double> chybaVOdhadu = VystupniData.spocitejChybnouVzdalenost(jsonPoleCilu);
            //Vypis chybne vzdalenosti
            //System.out.println("Odhad cile je vzdalen od realneho umisteni " + chybaVOdhadu.get(0).toString() + "km");
            

             // funkce vyvori kruznice s pevne zadanimi udaji - pro TEST
            //ArrayList<Kruznice> kruzniceNove = VstupniData.vytvorKruznice(orientacniBodyNove);

            
            //vystup programu - JSON pole s vyplnenimi udaji o poloze cilu
            System.out.println(jsonPoleCilu.toString());
            
        //pro TEST na lokalnim PC           
        //Nasledujic radky slouzi pro test.Pokud je program nahran na skolni serveru musi se zakomentovat
        } catch (Exception e) {
            Log.zapisDoLogu(e);
        }

        }
    }
