/*
 * Indoorhelper is a JOSM plug-in to support users when creating their own indoor maps.
 *  Copyright (C) 2016  Erik Gruschka
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package model;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;

import model.TagCatalog.IndoorObject;

/**
 * Counter for the calls of specific indoor objects, to track which items were used most frequently.
 * 
 * @author egru
 *
 */
public class PresetCounter {
	
	private List<IndoorObject> rankingList;
	private List<ObjectCounter> counterList;
	
	/**
	 * Initiates the counterList with the available IndoorObjects.
	 */
	
	public PresetCounter(){
		this.init();
	}
	
	private void init(){
		counterList = new ArrayList<>();
		
		counterList.add(new ObjectCounter(IndoorObject.CONCRETE_WALL, 0));
		counterList.add(new ObjectCounter(IndoorObject.DOOR, 0));
		counterList.add(new ObjectCounter(IndoorObject.ELEVATOR, 0));
		counterList.add(new ObjectCounter(IndoorObject.ENTRANCE, 0));
		counterList.add(new ObjectCounter(IndoorObject.GLASS_WALL, 0));
		counterList.add(new ObjectCounter(IndoorObject.ROOM, 0));
		counterList.add(new ObjectCounter(IndoorObject.SHELL, 0));
		counterList.add(new ObjectCounter(IndoorObject.STAIRWAYS, 0));
		counterList.add(new ObjectCounter(IndoorObject.STEPS, 0));
		counterList.add(new ObjectCounter(IndoorObject.TOILET_FEMALE, 0));
		counterList.add(new ObjectCounter(IndoorObject.TOILET_MALE, 0));
	}
	
	/**
	 * Increments the counter of a specific IndoorObject in the list.
	 * @param object the IndoorObject, which counter should be incremented
	 */
	public void count(IndoorObject object){
		ListIterator<ObjectCounter> iterator = this.counterList.listIterator();
		
		// Go through the list and increment the corresponding objects counter value.
		while(iterator.hasNext()){
			ObjectCounter counterTemp = iterator.next();
			if(counterTemp.getObject().equals(object)){
					counterList.get(iterator.nextIndex()-1).increment();	
			}
		}
		
		//Sort the list.
		this.sort();
	}
	
	private void sort(){
		Collections.sort(counterList);
		Collections.reverse(counterList);
	}
	
	public List<IndoorObject> getRanking(){
		rankingList = new ArrayList<IndoorObject>();
		
		rankingList.add(counterList.get(0).getObject());
		rankingList.add(counterList.get(1).getObject());
		rankingList.add(counterList.get(2).getObject());
		rankingList.add(counterList.get(3).getObject());
		
		return rankingList;
	}
	
	private class ObjectCounter implements Comparable<ObjectCounter>{
		private IndoorObject object;
		private int count;
		
		public ObjectCounter(IndoorObject o, int c) {
			this.object = o;
			this.count = c;
		}
		
		public int getCount(){
			return this.count;
		}
		
		public IndoorObject getObject(){
			return this.object;
		}
		
		public void increment(){
			this.count += 1;
		}
		
		@Override
		public int compareTo(ObjectCounter o) {
			if(this.getCount()<o.getCount()){
				return -1;
			}
			if(this.getCount()==o.getCount()){
				return 0;
			}
			if(this.getCount()>o.getCount()){
				return 1;
			}
			
			return 0;
		}
		
	}
	
}
