package at.reisinger.server;

import at.reisinger.server.objects.Request;
import at.reisinger.server.objects.Response;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Grundlegende Server logic
 * Vereint alle anderen Klassen
 */
public class Main {
    static final int port = 10001;
    private Socket socket;

    /**
     * Initial Start
     * @param args Nicht Verwendet
     */
    public static void main(String[] args) {
        if (!new DBConnection().init()) {
            System.err.println("DB init failed");
            System.exit(0);
        }
        System.out.println("\n\nStarte Server auf Port " + port + "\n\n");
        new Main(port);
    }

    /**
     * Öffnet den Server Socket und akzepiert diesen
     * @param port Port auf dem der Server läuft
     */
    public Main(int port){
        ServerSocket serverSocket;
        try {
            serverSocket = new ServerSocket(port);
            //noinspection InfiniteLoopStatement
            while (true){
                this.socket = serverSocket.accept();
                requestResponding();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Jeder Request durchläuft diese Funktion, reagiert auf requests
     */
    public void requestResponding(){
        try{
            System.out.println("Socket wurde gestartet!");
            Request rq = new Request(this.socket);
            new Response(rq.getUrl(), rq.getCmd(), rq.getOut(), rq.getAuthString(), rq.getPayload());
            this.socket.close();
            System.out.println("Socket wurde geschlossen!");
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
