package com.yahoo.labs.samoa.topology.impl;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2014 - 2015 Apache Software Foundation
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

import java.io.File;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.s4.core.util.AppConfig;
import org.apache.s4.core.util.ParsingUtils;
import org.apache.s4.deploy.DeploymentUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.yahoo.labs.samoa.tasks.Task;
import com.yahoo.labs.samoa.topology.ISubmitter;

import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;

public class S4Submitter implements ISubmitter {

  private static Logger logger = LoggerFactory.getLogger(S4Submitter.class);

  @Override
  public void deployTask(Task task) {
    // TODO: Get application FROM HTTP server
    // TODO: Initializa a http server to serve the app package

    String appURIString = null;
    // File app = new File(System.getProperty("user.dir")
    // + "/src/site/dist/SAMOA-S4-0.1-dist.jar");

    // TODO: String app url http://localhost:8000/SAMOA-S4-0.1-dist.jar
    try {
      URL appURL = new URL("http://localhost:8000/SAMOA-S4-0.1.jar");
      appURIString = appURL.toString();
    } catch (MalformedURLException e1) {
      e1.printStackTrace();
    }

    // try {
    // appURIString = app.toURI().toURL().toString();
    // } catch (MalformedURLException e) {
    // e.printStackTrace();
    // }
    if (task == null) {
      logger.error("Can't execute since evaluation task is not set!");
      return;
    } else {
      logger.info("Deploying SAMOA S4 task [{}] from location [{}]. ",
          task.getClass().getSimpleName(), appURIString);
    }

    String[] args = { "-c=testCluster2",
        "-appClass=" + S4DoTask.class.getName(),
        "-appName=" + "samoaApp",
        "-p=evalTask=" + task.getClass().getSimpleName(),
        "-zk=localhost:2181", "-s4r=" + appURIString, "-emc=" + SamoaSerializerModule.class.getName() };
    // "-emc=" + S4MOAModule.class.getName(),
    // "@" +
    // Resources.getResource("s4moa.properties").getFile(),

    S4Config s4config = new S4Config();
    JCommander jc = new JCommander(s4config);
    jc.parse(args);

    Map<String, String> namedParameters = new HashMap<String, String>();
    for (String parameter : s4config.namedParameters) {
      String[] param = parameter.split("=");
      namedParameters.put(param[0], param[1]);
    }

    AppConfig config = new AppConfig.Builder()
        .appClassName(s4config.appClass).appName(s4config.appName)
        .appURI(s4config.appURI).namedParameters(namedParameters)
        .build();

    DeploymentUtils.initAppConfig(config, s4config.clusterName, true,
        s4config.zkString);

    System.out.println("Suposedly deployed on S4");
  }

  public void initHTTPServer() {

  }

  @Parameters(separators = "=")
  public static class S4Config {

    @Parameter(names = { "-c", "-cluster" }, description = "Cluster name", required = true)
    String clusterName = null;

    @Parameter(names = "-appClass", description = "Main App class", required = false)
    String appClass = null;

    @Parameter(names = "-appName", description = "Application name", required = false)
    String appName = null;

    @Parameter(names = "-s4r", description = "Application URI", required = false)
    String appURI = null;

    @Parameter(names = "-zk", description = "ZooKeeper connection string", required = false)
    String zkString = null;

    @Parameter(names = { "-extraModulesClasses", "-emc" }, description = "Comma-separated list of additional configuration modules (they will be instantiated through their constructor without arguments).", required = false)
    List<String> extraModules = new ArrayList<String>();

    @Parameter(names = { "-p", "-namedStringParameters" }, description = "Comma-separated list of inline configuration "
        + "parameters, taking precedence over homonymous configuration parameters from configuration files. "
        + "Syntax: '-p=name1=value1,name2=value2 '", required = false, converter = ParsingUtils.InlineConfigParameterConverter.class)
    List<String> namedParameters = new ArrayList<String>();

  }

  @Override
  public void setLocal(boolean bool) {
    // TODO S4 works the same for local and distributed environments
  }
}
