
package integra.core;


import integra.helpers.ConfigServer;
import org.eclipse.jetty.server.*;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.webapp.WebAppContext;

import java.io.File;
import java.io.FilenameFilter;
import java.net.NetworkInterface;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 * @author Sebastian
 */
public class Main {


    private static Server server;


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {


        getMacAddresses();
        Initialize();

        StartAppServer();


    }



    private static void Initialize() {

        try {

            //Desactivo default Logger
            Logger globalLogger = Logger.getLogger("");
            java.util.logging.Handler[] handlers = globalLogger.getHandlers();
            for (java.util.logging.Handler handler : handlers) {
                globalLogger.removeHandler(handler);
            }
            java.util.logging.Handler ch = new ConsoleHandler();
            ch.setFormatter(new LogCustomFormatter());
            Logger.getLogger("").addHandler(ch);
            Logger.getLogger("").setUseParentHandlers(false);
            Logger.getLogger("").setLevel(Level.parse(ConfigServer.LogLevel));


        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, ex.toString());
        }

    }

    private static void StartAppServer() {
        try {

            // The Server
            server = new Server();

            // HTTP Configuration
            HttpConfiguration http_config = new HttpConfiguration();
            http_config.setSecureScheme("https");
            http_config.setSecurePort(ConfigServer.Port + 1);
            http_config.setOutputBufferSize(32768);

            // HTTP connector
            ServerConnector http = new ServerConnector(server,new HttpConnectionFactory(http_config));
            http.setPort(ConfigServer.Port);
            http.setIdleTimeout(30000);


            //SSL
            SslContextFactory sslContextFactory = new SslContextFactory();
            sslContextFactory.setKeyStorePath("web/keystore");
            sslContextFactory.setKeyStorePassword("ccdatapassword2008");
            sslContextFactory.setKeyManagerPassword("ccdatapassword2008");

            // HTTPS Configuration
            HttpConfiguration https_config = new HttpConfiguration(http_config);
            https_config.addCustomizer(new SecureRequestCustomizer());

            // HTTPS connector
            ServerConnector https = new ServerConnector(server,new SslConnectionFactory(sslContextFactory,"http/1.1"),new HttpConnectionFactory(https_config));
            https.setPort(ConfigServer.Port + 1);
            https.setIdleTimeout(50000);

            // Set the connectors
            server.setConnectors(new Connector[] { http, https });

            //Handler para acceso web, root del servidor web
            HandlerList hl = new HandlerList();
            ResourceHandler www = new ResourceHandler();
            www.setResourceBase("web/");
            hl.addHandler(www);

            //Deploy War principal
            WebAppContext h = new WebAppContext("web/IntegraPortalWS.war", "/Integra");
            hl.addHandler(h);



            //Hacer el deploy de todos los wars que se encuentren en el directorio web
            FilenameFilter filter = new FilenameFilter() {
                @Override
                public boolean accept(File dir, String name) {
                    return name.endsWith("war");
                }
            };
            File dir = new File("web");
            String[] children = dir.list(filter);

            for (int i = 0; i < children.length; i++) {

                if (!children[i].contains("IntegraPortalWS")) {

                    String[] path = children[i].split(".war");
                    WebAppContext auxwebapp = new WebAppContext("web/" + children[i], "/" + path[0]);
                    hl.addHandler(auxwebapp);
                    Logger.getLogger(Main.class.getName()).log(Level.INFO, "Deploy {0}", children[i]);

                }

            }

            // Set a handler
            server.setHandler(hl);
            server.setStopAtShutdown(true);

            // Start the server
            server.start();

            //inicializar el servidor
            URL url = new URL("http://localhost:" + ConfigServer.Port + "/Integra/resources/Login/Init");
            URLConnection urlc = url.openConnection();
            urlc.getInputStream();


            server.join();



        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, ex.toString());

        }
    }

    private static void getMacAddresses() {
        try {
            Enumeration<NetworkInterface> networkifs = NetworkInterface.getNetworkInterfaces();

            while (networkifs.hasMoreElements()) {
                NetworkInterface n = networkifs.nextElement();
                byte[] mac = n.getHardwareAddress();

                if (mac != null && mac.length > 0 && mac.length < 7) {
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < mac.length; i++) {
                        sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
                    }
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, "MAC: {0}", sb.toString());
                }
            }

        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, ex.toString());
        }

    }


}
