package core.server;

/*
    CONTROLLER, VIEW, MODEL

    CONTROLLER - получить запрос, передать данные из запроса дальше.

    SERVICE - получить данные и подготовить их.
    REPOSITORY - получить данные из БД.

    MODEL - это то, как выглядит таблица из БД в Java.
 */

import com.sun.net.httpserver.HttpServer;
import core.processor.impl.CarsProcessor;
import core.processor.impl.RootProcessor;
import core.utils.logs.Logger;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.sql.SQLException;

public class Server
{
    private final int port;
    private final HttpServer server;


    public Server(int port) throws IOException
    {
        this.port = port;
        this.server = create(port);
    }

    public void start()
    {
        this.server.start();
        register();

        Logger.info("Server started on: http://localhost:" + port);
    }

    private void register()
    {
        server.createContext("/", exchange -> new RootProcessor().process(exchange));
        server.createContext("/cars", exchange ->
        {
            try
            {
                new CarsProcessor().process(exchange);
            }
            catch (SQLException exception)
            {
                Logger.error(exception.getMessage());
            }
        });
    }

    private HttpServer create(int port) throws IOException
    {
        HttpServer server = this.server;

        if (server == null)
        {
            synchronized (HttpServer.class)
            {
                InetSocketAddress socket = new InetSocketAddress("localhost", port);
                server = HttpServer.create(socket, port);
            }
        }

        return server;
    }
}
