package com.mongodb.hvdf.allocators;

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

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.hvdf.configuration.PluginConfiguration;
import com.mongodb.hvdf.configuration.PluginConfiguration.HVDF;
import com.mongodb.hvdf.configuration.TimePeriod;

public class PeriodicAllocator implements CollectionAllocator{
	
	private static final String TIME_PERIOD = "period";
	
	private long period = 0;
	private String prefix = null;
	private int prefixLength;
	private DB db = null;
	
	public PeriodicAllocator(PluginConfiguration config){
		
		TimePeriod tPeriod = config.get(TIME_PERIOD, TimePeriod.class);
		period = tPeriod.getAs(TimeUnit.MILLISECONDS);
		prefix = config.get(HVDF.PREFIX, String.class);
		prefixLength = prefix.length();
		db = config.get(HVDF.DB, DB.class);
	}
	

	@Override
	public DBCollection getCollection(long timestamp) {
		String collName = prefix + timestamp/period;
		return db.getCollection(collName);
		
	}

	@Override
	public DBCollection getPreviousWithLimit(DBCollection current, long minTime) {
		
		// figure out the current timeslice
		String currentName = current.getName();
		long currSuffix = getSuffix(currentName);
		
		// If minTime is before the lower bound of this collection,
		// just get the collection with the previous suffix
		if(minTime < currSuffix*this.period){
			return db.getCollection(this.prefix + (currSuffix - 1));
		}

		return null;
	}
	
	@Override
	public List<SliceDetails> getCollectionSlices(){
		
		// get the collection names
		List<SliceDetails> result = new ArrayList<SliceDetails>();
		
		for(String name : this.db.getCollectionNames()){
			if(name.startsWith(this.prefix)){
				long minTime = getSuffix(name)*this.period;
				result.add(new SliceDetails(name, minTime, minTime + this.period - 1));
			}			
		}
		
		return result;
	}
	
	private long getSuffix(final String collName){
		return Long.parseLong(collName.substring(this.prefixLength));
	}

}