package io.prediction.examples.java.recommendations.tutorial4;

import io.prediction.controller.java.LJavaPreparator;
import io.prediction.controller.java.EmptyParams;

import java.util.Arrays;
import java.util.Map;
import java.util.HashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.apache.commons.math3.linear.ArrayRealVector;
import org.apache.commons.math3.linear.RealVector;

public class Preparator extends LJavaPreparator<EmptyParams, TrainingData, PreparedData> {

  final static Logger logger = LoggerFactory.getLogger(Preparator.class);
  final int indexOffset = 5;

  public Preparator() {}

  public PreparedData prepare(TrainingData trainingData) {
    Map<Integer, RealVector> itemFeatures = new HashMap<Integer, RealVector>();

    int featureSize = trainingData.genres.size();

    for (Integer iid: trainingData.itemInfo.keySet()) {
      String[] info = trainingData.itemInfo.get(iid);

      RealVector features = new ArrayRealVector(featureSize);
      for (int i = 0; i < featureSize; i++) {
        features.setEntry(i, Double.parseDouble(info[i + indexOffset]));
      }
      itemFeatures.put(iid, features);
    }

    return new PreparedData(trainingData, itemFeatures, featureSize);
  }
}
