package com.yahoo.labs.samoa.learners.clusterers.simple;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2013 Yahoo! Inc.
 * %%
 * 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%
 */

/**
 * License
 */

import com.google.common.collect.ImmutableSet;
import java.util.Set;

import com.github.javacliparser.ClassOption;
import com.github.javacliparser.Configurable;
import com.github.javacliparser.IntOption;
import com.yahoo.labs.samoa.core.Processor;
import com.yahoo.labs.samoa.instances.Instances;
import com.yahoo.labs.samoa.learners.Learner;
import com.yahoo.labs.samoa.learners.clusterers.*;
import com.yahoo.labs.samoa.topology.ProcessingItem;
import com.yahoo.labs.samoa.topology.Stream;
import com.yahoo.labs.samoa.topology.TopologyBuilder;

/**
 * 
 * Learner that contain a single learner.
 * 
 */
public final class DistributedClusterer implements Learner, Configurable {

  private static final long serialVersionUID = 684111382631697031L;

  private Stream resultStream;

  private Instances dataset;

  public ClassOption learnerOption = new ClassOption("learner", 'l', "Clusterer to use.", LocalClustererAdapter.class,
      ClustreamClustererAdapter.class.getName());

  public IntOption paralellismOption = new IntOption("paralellismOption", 'P',
      "The paralellism level for concurrent processes", 2, 1, Integer.MAX_VALUE);

  private TopologyBuilder builder;

  // private ClusteringDistributorProcessor distributorP;
  private LocalClustererProcessor learnerP;

  // private Stream distributorToLocalStream;
  private Stream localToGlobalStream;

  // private int parallelism;

  @Override
  public void init(TopologyBuilder builder, Instances dataset, int parallelism) {
    this.builder = builder;
    this.dataset = dataset;
    // this.parallelism = parallelism;
    this.setLayout();
  }

  protected void setLayout() {
    // Distributor
    // distributorP = new ClusteringDistributorProcessor();
    // this.builder.addProcessor(distributorP, parallelism);
    // distributorToLocalStream = this.builder.createStream(distributorP);
    // distributorP.setOutputStream(distributorToLocalStream);
    // distributorToGlobalStream = this.builder.createStream(distributorP);

    // Local Clustering
    learnerP = new LocalClustererProcessor();
    LocalClustererAdapter learner = (LocalClustererAdapter) this.learnerOption.getValue();
    learner.setDataset(this.dataset);
    learnerP.setLearner(learner);
    builder.addProcessor(learnerP, this.paralellismOption.getValue());
    localToGlobalStream = this.builder.createStream(learnerP);
    learnerP.setOutputStream(localToGlobalStream);

    // Global Clustering
    LocalClustererProcessor globalClusteringCombinerP = new LocalClustererProcessor();
    LocalClustererAdapter globalLearner = (LocalClustererAdapter) this.learnerOption.getValue();
    globalLearner.setDataset(this.dataset);
    globalClusteringCombinerP.setLearner(learner);
    builder.addProcessor(globalClusteringCombinerP, 1);
    builder.connectInputAllStream(localToGlobalStream, globalClusteringCombinerP);

    // Output Stream
    resultStream = this.builder.createStream(globalClusteringCombinerP);
    globalClusteringCombinerP.setOutputStream(resultStream);
  }

  @Override
  public Processor getInputProcessor() {
    // return distributorP;
    return learnerP;
  }

  @Override
  public Set<Stream> getResultStreams() {
    Set<Stream> streams = ImmutableSet.of(this.resultStream);
    return streams;
  }
}
