package org.toilelibre.libe.outside.monitor;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.batch.JobExecutionExitCodeGenerator;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@SpringBootApplication
@EnableWebMvc
public class StupidHttpServer {

    private static ConfigurableApplicationContext context;

    private static int                            managementPort;

    private static int                            port;

    public static void main (final String [] args) {
        StupidHttpServer.start (args);
    }

    public static int port () {
        return StupidHttpServer.port;
    }

    public static int [] start () {
        return StupidHttpServer.start (new String [0]);
    }

    public static int [] start (final String [] args) {
        final Random random = new Random ();
        StupidHttpServer.port = random.nextInt (32767) + 32768;
        StupidHttpServer.managementPort = random.nextInt (32767) + 32768;
        StupidHttpServer.start (StupidHttpServer.port, StupidHttpServer.managementPort, args);
        return new int [] { StupidHttpServer.port, StupidHttpServer.managementPort };
    }

    public static void start (final int port, final int managementPort, final String [] args) {
        Map<String, Object> properties = new HashMap<String, Object> ();
        properties.put ("server.port", port);
        properties.put ("management.port", managementPort);

        StupidHttpServer.context = new SpringApplicationBuilder ().sources (StupidHttpServer.class).bannerMode (Banner.Mode.OFF).addCommandLineProperties (true).properties (properties).run (args);
    }

    public static void stop () {
        SpringApplication.exit (StupidHttpServer.context, new JobExecutionExitCodeGenerator ());
    }
}