package edu.illinois.lis.feedback;

import java.text.DecimalFormat;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import cc.twittertools.thrift.gen.TResult;
import edu.illinois.lis.document.FeatureVector;
import edu.illinois.lis.query.GQuery;
import edu.illinois.lis.utils.KeyValuePair;
import edu.illinois.lis.utils.ScorableComparator;
import edu.illinois.lis.utils.Stopper;


public abstract class FeedbackModel {
	protected List<TResult> relDocs;
	protected GQuery originalQuery;
	protected int fbDocCount  = 20;
	protected int fbTermCount = 20;
	protected List<KeyValuePair> features;		// these will be KeyValuePair objects
	protected Stopper stopper;
	
	
	
	public void build(Stopper stopper) {
		this.stopper = stopper;
	}
	

	
	public GQuery asGquery() {
		GQuery newQuery = new GQuery();
		newQuery.setTitle(originalQuery.getTitle());
		newQuery.setText(originalQuery.getText());
		
		FeatureVector finalVector = new FeatureVector(stopper);
		
		ScorableComparator comparator = new ScorableComparator(true);
		Collections.sort(features, comparator);
		Iterator<KeyValuePair> it = features.iterator();
		
		int i=0;
		while(it.hasNext() && i++ < fbTermCount) {			
			KeyValuePair tuple = it.next();
			finalVector.addTerm(tuple.getKey(), tuple.getScore());
		}
		
		newQuery.setFeatureVector(finalVector);
		
		return newQuery;
	}

	public FeatureVector asFeatureVector() {
		FeatureVector f = new FeatureVector(stopper);
		Iterator<KeyValuePair> it = features.iterator();
		
		while(it.hasNext()) {			
			KeyValuePair tuple = it.next();
			f.addTerm(tuple.getKey(), tuple.getScore());
		}	
		
		return f;
	}
	
	public Map<String,Double> asMap() {
		Map<String,Double> map = new HashMap<String,Double>(features.size());
		Iterator<KeyValuePair> it = features.iterator();
		while(it.hasNext()) {
			KeyValuePair tuple = it.next();
			map.put(tuple.getKey(), tuple.getScore());
		}

		return map;
	}
	
	@Override 
	public String toString() {
		return toString(features.size());
	}
	
	public String toString(int k) {
		DecimalFormat format = new DecimalFormat("#.#####################");


		
		ScorableComparator comparator = new ScorableComparator(true);
		Collections.sort(features, comparator);
		
		double sum = 0.0;
		Iterator<KeyValuePair> it = features.iterator();
		int i=0;
		while(it.hasNext() && i++ < k) {			
			sum += it.next().getScore();
		}
		
		StringBuilder b = new StringBuilder();
		it = features.iterator();
		i=0;
		while(it.hasNext() && i++ < k) {			
			KeyValuePair tuple = it.next();
			b.append(format.format(tuple.getScore()/sum) + " " + tuple.getKey() + "\n");
		}
		
		return b.toString();
	}
	

	public void setRes(List<TResult> relDocs) {
		this.relDocs = relDocs;
	}
	public void setOriginalQuery(GQuery originalQuery) {
		this.originalQuery = originalQuery;
	}
	public void setFbTermCount(int fbTermCount) {
		this.fbTermCount = fbTermCount;
	}
	
	
	
	
}
