/*
Program ceka na portu 49700 a pokud prijde prikaz s IP cile tak tuto IP adresu preda programu
OctantSrverPlanetLab
 */
package tcpserver;

import java.io.*;
import java.net.*;

/**
 *
 * @author Filip Dvorak
 */
public class TcpServer {

    //reakce na prikaz quit se nastavi na false
    public static boolean quit = false;

 
    public static void main(String[] args) throws IOException {

        //vytvoreni soketu
        ServerSocket serverSocket = null;
        int cisloPortu = 49700;
        //kdyt port neni volny tak se posune na dalsi
        while (serverSocket == null) {
            try {
                //soket nasloucha na cisloPortu
                serverSocket = new ServerSocket(cisloPortu);
                Log.zapisDoLogu("Cislo portu je: " + cisloPortu);
                System.out.println("Cislo portu je: " + cisloPortu);
            } catch (IOException e) {
                Log.zapisDoLogu(e);
            }
            cisloPortu++;
            if (cisloPortu > 65535) {
                Log.zapisDoLogu("Volny port nebyl nalezen");
                System.out.println("Volny port nebyl nalezen");
                serverSocket.close();
                return;
            }

        }

        //podminka nastartovani vlakna
        while (quit == false) {
            try {
               //spusti vlakno, pokud se pripoji klient
                Socket klient = serverSocket.accept();
                ServerThread vlakno = new ServerThread(klient);
                vlakno.start();
            } catch (IOException e) {
                Log.zapisDoLogu(e);
                System.out.println(e);
            }
        }
        //uzavreni serverSocket
        serverSocket.close();

    }

    private static class ServerThread extends Thread {

        private Socket socket;

        public ServerThread(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            //smaze log
            Log.smazSouborLog();
            
            //prikaz (string) od klienta
            BufferedReader prikazOdKlienta;
            //vracena hodnota - vzdalenost
            DataOutputStream hodnotaOdServeru;

            try {
                //ulozi prichozi prikaz od klienta
                prikazOdKlienta = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                hodnotaOdServeru = new DataOutputStream(socket.getOutputStream());
            } catch (IOException e) {
                Log.zapisDoLogu(e);
                
                return;
            }

            try {
                //ulozi prikaz od klienta do promenne prikaz
                String prikaz = prikazOdKlienta.readLine();
                //rozdeli prikaz na dva - vzdalenost a IP
                String hodnotyVprikazu[] = prikaz.split(" ");

                Log.zapisDoLogu("Prichozi prikaz: " + prikaz);
                Log.zapisDoLogu("PRvni cast prikazu " + hodnotyVprikazu[0]);
                Log.zapisDoLogu("Druha cast prikazu " + hodnotyVprikazu[1]);
                
                
                
                
                //po prikazu quit se ukonci demon
                if (hodnotyVprikazu[0].equals("quit")) {
                    
                    quit = true;
                    
                }
                //hodnota prikazu ne zapnuti vypoctu je vzdalenost
                else if (hodnotyVprikazu[0].equals("vzdalenost")) {
                    Log.zapisDoLogu("Prichozi prikaz vzdalenost :");
                   
                    String ipAdresaCile = hodnotyVprikazu[1];
                    Log.zapisDoLogu("ip address k pingu: " + ipAdresaCile);
                  
                    
                    //prikaz co ma spustit
                    ProcessBuilder pb = new ProcessBuilder("java", "-jar","/home/cesnet_vutbr2/xdvora02/OctantServerPlanetLab.jar", ipAdresaCile);
                    Log.zapisDoLogu("Spusten prikaz java -jar /home/cesnet_vutbr2/xdvora02/OctantServerPlanetLab.jar");
                  
                   
                    //spusteni procesu
                    Process proces = pb.start();
                    Log.zapisDoLogu("prikaz vykonan");
                    
                    
                    //ulozi do bufferu hodnotu z predchoziho vypoctu - vzdalenostHorni a vzdalenostSpodni (polomery mezikruzi)
                    BufferedReader br = new BufferedReader(new InputStreamReader(proces.getInputStream()));

                    String posledniradek = null;
                    String radek = null;
                    while ((radek = br.readLine()) != null) 
                    {
                        posledniradek = radek;
                    }
                    
                    Log.zapisDoLogu("od OctantServer.jar: " + posledniradek);
                  
                     
                    hodnotaOdServeru.writeBytes(posledniradek);
                   
                    
                    Log.zapisDoLogu("zapsano do klienta");
                    //poslani hodnoty od serveru ke klientovi
                    hodnotaOdServeru.flush();
                    Log.zapisDoLogu("poslano klientovi");
                }

            } catch (IOException e) {
                Log.zapisDoLogu(e);
            }
            try {
                Log.zapisDoLogu("zavreni soketu");
                //ukonceni bufferReadr apod.
                prikazOdKlienta.close();
                hodnotaOdServeru.close();
                //uzavreni vlakna
                socket.close();

            } catch (IOException e) {

                Log.zapisDoLogu("Vse zavreno");
            }

        }
    }
}
