/**
 *
 */
package org.eclipse.smila.solr.search;

import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang.ArrayUtils;
import org.eclipse.smila.datamodel.Any.ValueType;
import org.eclipse.smila.datamodel.Record;
import org.eclipse.smila.datamodel.util.MetadataUtils;
import org.eclipse.smila.datamodel.util.MetadataUtils.Mode;
import org.eclipse.smila.solr.SolrSchemaService;
import org.eclipse.smila.solr.SolrServiceException;
import org.eclipse.smila.solr.params.KeyValueParam;

import com.google.common.base.Splitter;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

/**
 * @author pwissel
 *
 */
public class FieldValueTypeCache {

  private static final long EXPIRE_AFTER_MINUTES_DEFAULT = 60;

  final SolrSchemaService _schemaService;

  LoadingCache<String, ValueType> _cache = null;

  final Splitter _splitter = Splitter.on("/");

  public FieldValueTypeCache(final SolrSchemaService schemaService) {
    this(schemaService, EXPIRE_AFTER_MINUTES_DEFAULT);
  }

  public FieldValueTypeCache(final SolrSchemaService schemaService, Long exprireAfterMinutes) {
    _schemaService = schemaService;
    exprireAfterMinutes = exprireAfterMinutes != null ? exprireAfterMinutes : EXPIRE_AFTER_MINUTES_DEFAULT;
    // builder cache
    _cache =
      CacheBuilder.newBuilder().expireAfterWrite(exprireAfterMinutes, TimeUnit.MINUTES)
        .build(new CacheLoader<String, ValueType>() {

          @Override
          public ValueType load(final String key) throws Exception {
            return newValueType(key);
          }

        });
  }

  private ValueType newValueType(final String key) throws SolrServiceException {
    final List<String> split = _splitter.splitToList(key);
    final String type = getTypeFromSchema(split.get(0), split.get(1), split.get(2));
    return getTypeAsValueType(type);
  }

  public ValueType get(final String client, final String index, final String field) throws ExecutionException {
    final String key = getKey(client, index, field);
    return _cache.get(key);
  }

  private String getKey(final String client, final String index, final String field) {
    return new StringBuilder("#").append(client).append("/").append(index).append("/").append(field).toString();
  }

  private String getTypeFromSchema(final String client, final String index, final String field)
    throws SolrServiceException {
    final Record fieldInfo =
      _schemaService.getField(client, index, field, new KeyValueParam("includeDynamic", true));
    return MetadataUtils.getValue(fieldInfo.getMetadata(), Mode.FAIL, "fields", "1", "type").asString();
  }

  private static final String[] LONGS = { "int", "short", "long" };

  private static final String[] DOUBLES = { "float", "double" };

  private static final String[] DATES = { "date" };

  private static final String[] BOOLEANS = { "boolean" };

  private ValueType getTypeAsValueType(final String type) {
    if (ArrayUtils.contains(LONGS, type)) {
      return ValueType.LONG;
    } else if (ArrayUtils.contains(DOUBLES, type)) {
      return ValueType.DOUBLE;
    } else if (ArrayUtils.contains(DATES, type)) {
      return ValueType.DATETIME;
    } else if (ArrayUtils.contains(BOOLEANS, type)) {
      return ValueType.BOOLEAN;
    }
    return ValueType.STRING;
  }

}
