package pta.de;

import com.codahale.metrics.health.HealthCheck;
import io.dropwizard.Application;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import org.eclipse.jetty.servlets.CrossOriginFilter;
import pta.de.core.controller.BackendController;
import pta.de.core.controller.InitServicesConfigCacheJob;
import pta.de.health.ConfigFilePresentHealthCheck;
import pta.de.resources.MicsCentralResource;

import javax.servlet.DispatcherType;
import javax.servlet.FilterRegistration;
import java.util.EnumSet;

public class micsCentralApplication extends Application<micsCentralConfiguration> {

    public static void main(final String[] args) throws Exception {
        new micsCentralApplication().run(args);
    }

    @Override
    public String getName() {
        return "micsCentral";
    }

    @Override
    public void initialize(final Bootstrap<micsCentralConfiguration> bootstrap) {
    }

    @Override
    public void run(final micsCentralConfiguration configuration,
                    final Environment environment) {

        initAppEnvironment( configuration );

        final MicsCentralResource micsCentralResource = new MicsCentralResource();
        final HealthCheck configFilePresentHC = new ConfigFilePresentHealthCheck();

        environment.healthChecks().register("configFilePresent", configFilePresentHC );
        environment.jersey().register(micsCentralResource);

        configureCors(environment);
    }

    private void initAppEnvironment( micsCentralConfiguration conf ) {
        InitServicesConfigCacheJob.init(conf.getServicesDistributionFileName());
    }

    private void configureCors(Environment environment) {
        final FilterRegistration.Dynamic cors =
                environment.servlets().addFilter("CORS", CrossOriginFilter.class);

        // Configure CORS parameters
        cors.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
        cors.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "X-Requested-With,Content-Type,Accept,Origin,Authorization,X-XSRF-TOKEN");
        cors.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "OPTIONS,GET,PUT,POST,DELETE,HEAD");
        cors.setInitParameter(CrossOriginFilter.ALLOW_CREDENTIALS_PARAM, "true");

        // Add URL mapping
        cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
        // DO NOT pass a preflight request to down-stream auth filters
        // unauthenticated preflight requests should be permitted by spec
        cors.setInitParameter(CrossOriginFilter.CHAIN_PREFLIGHT_PARAM, Boolean.FALSE.toString());
    }

}
