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

import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

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

    public static ArrayList<Primka> nacteniZeSouboruProObalkuHorni(BufferedReader bufferHorni) {

        ArrayList<Primka> polePrimekHorni = new ArrayList<Primka>();

        String radek = null;
        Double aX, aY, bX, bY;
        Double k = null;
        Double q = null;

        try {
            //nacte jednotlive radky, na kterych je hodnota, po sobe a ulozi hodnoty do pole polePrimekHorni; 
            while ((radek = bufferHorni.readLine()) != null) {
                //rozdeli a ulozi hodnoty oddelene mezerou
                String[] hodnota = radek.split(" ");
                //podminka zda v poli je vic jak 5 hodnot.....pokud ne tak se zapis preskoci
                if (hodnota.length > 5) {
                    try {
                        aX = Double.valueOf(hodnota[0]);
                        aY = Double.valueOf(hodnota[1]);
                        bX = Double.valueOf(hodnota[2]);
                        bY = Double.valueOf(hodnota[3]);
                        k = Double.valueOf(hodnota[4]);
                        q = Double.valueOf(hodnota[5]);

                        polePrimekHorni.add(new Primka(k, q, new Souradnice(aX, aY), new Souradnice(bX, bY)));
                    } catch (NumberFormatException e) {
                        //System.out.println("Na radku chybi hodnota");
                        Log.zapisDoLogu(e);
                        
                    }
                }
            }
        } catch (IOException ex) {
            //System.out.println("V souboru nejsou hodnoty");
            Logger.getLogger(OctantServer.class.getName()).log(Level.SEVERE, null, ex);
            Log.zapisDoLogu("V souboru obalkaHorni nejsou hodnoty - program serverPlanetLab");
           
        }

        return polePrimekHorni;
    }

    public static ArrayList<Primka> nacteniZeSouboruProObalkuSpodni(BufferedReader bufferSpodni) {


        ArrayList<Primka> polePrimekSpodni = new ArrayList<Primka>();

        String radek = null;
        Double aX, aY, bX, bY;
        Double k = null;
        Double q = null;

        try {
            //nacte jednotlive radky po sobe a ulozi hodnoty do pole polePrimekHorni; 
            while ((radek = bufferSpodni.readLine()) != null) {
                //rozdeli a ulozi hodnoty oddelene mezerou
                String[] hodnota = radek.split(" ");
                //podminka zda v poli je vic jak 5 hodnot.....pokud ne tak se zapis preskoci
                if (hodnota.length > 5) {
                    try {
                        aX = Double.valueOf(hodnota[0]);
                        aY = Double.valueOf(hodnota[1]);
                        bX = Double.valueOf(hodnota[2]);
                        bY = Double.valueOf(hodnota[3]);
                        k = Double.valueOf(hodnota[4]);
                        q = Double.valueOf(hodnota[5]);

                        polePrimekSpodni.add(new Primka(k, q, new Souradnice(aX, aY), new Souradnice(bX, bY)));
                    } catch (NumberFormatException e) {
                        //System.out.println("Na radku chybi hodnota");
                        Log.zapisDoLogu(e);
                        
                    }
                }
            }
        } catch (IOException ex) {
            //System.out.println("V souboru nejsou hodnoty");
            Logger.getLogger(OctantServer.class.getName()).log(Level.SEVERE, null, ex);
         //   Log.zapisDoLogu(ex);
            Log.zapisDoLogu("V souboru obalkaSpodni nejsou hodnoty - program serverPlanetLab");
        }

        return polePrimekSpodni;

    }

    public static Primka najdiPrimku(ArrayList<Primka> obalkaHorni, Double casPing) {

        Primka hledanaPrimka = null;
        //prohledava pole obalkaHorni
        for (Primka primka : obalkaHorni) {
            //podminka, kdy ziskane minimalni zpozdeni(casPing) lezi mezi dvema body
            if (casPing >= primka.getA().getSouradniceY() && casPing <= primka.getB().getSouradniceY() || casPing >= primka.getB().getSouradniceY() && casPing <= primka.getA().getSouradniceY()) {
                return primka;
            }
        }
        return hledanaPrimka;
    }

    public static Double najdiVzdalenost(Primka hledanaPrimkaHorni, Double casPing) {

        Double vzdalenost = 0.0;
        // pokud je ping vetsi nez 0 tak jej prevedu na vzdalenost
        if (casPing != 0.0) {
            // je to ok ten ping
            //fce vypocita vzdalenost ---dle vzorce x = (y-q)/k ,kde x je vzdalenost a y je zpozdeni,k smernice, q posunuti
            vzdalenost = (casPing - hledanaPrimkaHorni.getQ()) / hledanaPrimkaHorni.getK();
        }
        return vzdalenost;
    }

    static Primka najdiPrimkuDolni(ArrayList<Primka> obalkaSpodni, Double vzdalenost) {
               Primka hledanaPrimka = null;
        //prohledava pole obalkaHorni/obalka Spodni
        for (Primka primka : obalkaSpodni) {
            //podminka, kdy ziskane minimalni zpozdeni(casPing) lezi mezi dvema body
            if (vzdalenost >= primka.getA().getSouradniceX() && vzdalenost <= primka.getB().getSouradniceX() || vzdalenost >= primka.getB().getSouradniceX() && vzdalenost <= primka.getA().getSouradniceX()) {
                return primka;
            }
        }
        return hledanaPrimka;
    }
}
