package com.stubbornjava.examples.undertow;

import com.stubbornjava.common.undertow.Exchange;
import com.stubbornjava.common.undertow.handlers.Middleware;
import com.stubbornjava.examples.undertow.contenttypes.ContentTypesServer;
import com.stubbornjava.examples.undertow.rest.RestServer;
import com.stubbornjava.examples.undertow.routing.ConstantStringHandler;

import io.undertow.Undertow;
import io.undertow.server.HttpHandler;
import io.undertow.server.RoutingHandler;

public class MicroMonolith {

    public static void main(String[] args) {

        // {{start:restServer}}
        Undertow.builder()
                .addHttpListener(8080, "0.0.0.0", Middleware.common(RestServer.ROOT))
                .build()
                .start();
        // {{end:restServer}}

        // {{start:contentTypesServer}}
        Undertow.builder()
                .addHttpListener(8081, "0.0.0.0", Middleware.common(ContentTypesServer.ROUTES))
                .build()
                .start();
        // {{end:contentTypesServer}}

        // {{start:combinedServer}}
        RoutingHandler combinedHanlder = new RoutingHandler().addAll(RestServer.ROUTES)
                                                             .addAll(ContentTypesServer.ROUTES);
        Undertow.builder()
                .addHttpListener(8082, "0.0.0.0", Middleware.common(combinedHanlder))
                .build()
                .start();
        // {{end:combinedServer}}

        // {{start:multiPortServer}}
        Undertow.builder()
                .addHttpListener(8083, "0.0.0.0", Middleware.common(RestServer.ROOT))
                .addHttpListener(8084, "0.0.0.0", Middleware.common(ContentTypesServer.ROUTES))
                .build()
                .start();
        // {{end:multiPortServer}}

        // {{start:microserviceService}}
        Undertow.builder()
                .addHttpListener(8085, "0.0.0.0", exchange -> {
            Integer port = Exchange.queryParams()
                                   .queryParamAsInteger(exchange, "port")
                                   .orElse(null);
            if (port != null) {
                try {
                    HttpHandler handler = new ConstantStringHandler("web server with port " + port);
                    Undertow.builder()
                            .addHttpListener(port, "0.0.0.0", handler)
                            .build()
                            .start();
                } catch (Exception e) {
                    String message = "error trying to create web sertver with port " + port;
                    Exchange.body().sendText(exchange, message);
                    return;
                }
                Exchange.body().sendText(exchange, "server with port " + port + " created");
                return;
            }
            Exchange.body().sendText(exchange, "port cannot be null");
        })
        .build()
        .start();
        // {{end:microserviceService}}
    }
}