package processing.analyzing;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import common.Bookmark;
import common.CooccurenceMatrix;

public class UserTagProperties {

	private final static double TIME_CONST = 1.0; // for seconds
	//private final static double TIME_CONST = 3600.0; // for hours
	//private final static double TIME_CONST = 86400.0; // for days
	
	private Map<Integer, Integer> tagCounts = null;
	private Map<Integer, Integer> tagRecencies = null;
	private Map<Integer, Integer> tagContextSim = null;
	private Map<Integer, Integer> tagReuseProb = null;
	
	public UserTagProperties(List<Bookmark> userBookmarks, Bookmark testBookmark, CooccurenceMatrix tagMatrix) {
		this.tagCounts = new LinkedHashMap<Integer, Integer>();
		this.tagRecencies = new LinkedHashMap<Integer, Integer>();
		this.tagContextSim = new LinkedHashMap<Integer, Integer>();
		this.tagReuseProb = new LinkedHashMap<Integer, Integer>();
		
		for (Bookmark bookmark : userBookmarks) {
			int currentRecency = (int) Math.round((Long.parseLong(testBookmark.getTimestamp()) - Long.parseLong(bookmark.getTimestamp())) / TIME_CONST);
			for (int tag : bookmark.getTags()) {
				Integer count = this.tagCounts.get(tag);
				Integer recency = this.tagRecencies.get(tag);
				Integer contextSim = this.tagContextSim.get(tag);
				Integer reuseProb = this.tagReuseProb.get(tag);
				
				if (count == null) {
					this.tagCounts.put(tag, 1);
				} else {
					this.tagCounts.put(tag, count.intValue() + 1);
				}
				if (recency == null) {
					this.tagRecencies.put(tag, currentRecency);
				} else {
					if (currentRecency < recency) {
						this.tagRecencies.put(tag, currentRecency);
					}
				}
				if (tagMatrix != null) {
					if (contextSim == null) {
						this.tagContextSim.put(tag, tagMatrix.getCoocurenceCount(tag, testBookmark.getTags()));
					}
				}
				if (reuseProb == null) {
					this.tagReuseProb.put(tag, testBookmark.getTags().contains(tag) ? 1 : 0);
				}
			}
		}
	}
	
	public Map<Integer, Integer> getTagCounts() {
		return this.tagCounts;
	}

	public Map<Integer, Integer> getTagRecencies() {
		return this.tagRecencies;
	}
	
	public Map<Integer, Integer> getTagContextSim() {
		return this.tagContextSim;
	}
	
	public Map<Integer, Integer> getReuseProb() {
		return this.tagReuseProb;
	}
}
