/**
 * Copyright © 2009,2010 Res Interactive, LLC. All Rights Reserved.
 */
package com.tootsville.tootsbook.client.util;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;

import com.google.gwt.user.client.rpc.IsSerializable;
import com.tootsville.tootsbook.client.exception.NotFoundException;
import com.tootsville.tootsbook.client.util.ThemeItem.ThemeItemType;

/**
 * WRITEME
 * 
 * @author twheys@gmail.com
 */
public class AvailableItems implements IsSerializable {

	/**
	 * WRITEME brpocock@star-hope.org Jul 29, 2010
	 */
	private int avatarBackgroundsTracker;
	/**
	 * WRITEME brpocock@star-hope.org Jul 29, 2010
	 */
	private int boxStylesTracker;
	/**
	 * WRITEME brpocock@star-hope.org Jul 29, 2010
	 */
	private int iconsTracker;

	/**
	 * WRITEME twheys@gmail.com
	 */
	private final HashMap <ThemeItemType, HashMap <Integer, ThemeItem>> itemsByType = new HashMap <ThemeItemType, HashMap <Integer, ThemeItem>> ();

	/**
	 * WRITEME brpocock@star-hope.org Jul 29, 2010
	 */
	private int pageBackgroundsTracker;

	/**
	 * WRITEME brpocock@star-hope.org Jul 29, 2010
	 */
	private int titleBackgroundsTracker;

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * A AvailableItems WRITEME...
	 */
	public AvailableItems () {
		initItemMaps ();

	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO add WRITEME...
	 * 
	 * @param item WRITEME twheys@gmail.com
	 */
	public void add (final ThemeItem item) {
		HashMap <Integer, ThemeItem> theHash = itemsByType
				.get (item.getType ());
		if (null == theHash) {
			theHash = new HashMap <Integer, ThemeItem> ();
			itemsByType.put (item.getType (), theHash);
		}
		theHash.put (Integer.valueOf (nextKey (theHash.keySet ())),
				item);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getCurrentlySelectedAvatarBackground WRITEME...
	 * 
	 * @return WRITEME twheys@gmail.com
	 */
	public ThemeItem getActiveAvatarBackground () {
		avatarBackgroundsTracker = getNextForTracker (
				avatarBackgroundsTracker,
				itemsByType.get (ThemeItemType.avatarBG).size (), true);
		return itemsByType.get (ThemeItemType.avatarBG).get (
				Integer.valueOf (0));
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getCurrentlySelectedBoxStyle WRITEME...
	 * 
	 * @return WRITEME twheys@gmail.com
	 */
	public ThemeItem getActiveBoxStyle () {
		boxStylesTracker = getNextForTracker (boxStylesTracker,
				itemsByType.get (ThemeItemType.boxStyle).size (), true);
		return itemsByType.get (ThemeItemType.boxStyle).get (
				Integer.valueOf (0));
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getCurrentlySelectedIcon WRITEME...
	 * 
	 * @return WRITEME twheys@gmail.com
	 */
	public ThemeItem getActiveIcon () {
		iconsTracker = getNextForTracker (iconsTracker, itemsByType
				.get (ThemeItemType.icon).size (), true);
		return itemsByType.get (ThemeItemType.icon).get (
				Integer.valueOf (0));
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getCurrentlySelectPageBackground WRITEME...
	 * 
	 * @return WRITEME twheys@gmail.com
	 */
	public ThemeItem getActivePageBackground () {
		pageBackgroundsTracker = getNextForTracker (
				pageBackgroundsTracker,
				itemsByType.get (ThemeItemType.pageBG).size (), true);
		return itemsByType.get (ThemeItemType.pageBG).get (
				Integer.valueOf (0));

	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getCurrentlySelectedTitleBackground WRITEME...
	 * 
	 * @return WRITEME twheys@gmail.com
	 */
	public ThemeItem getActiveTitleBackground () {
		titleBackgroundsTracker = getNextForTracker (
				titleBackgroundsTracker,
				itemsByType.get (ThemeItemType.titleBG).size (), true);

		return itemsByType.get (ThemeItemType.titleBG).get (
				Integer.valueOf (0));
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getCurrentlySelectedAvatarBackground WRITEME...
	 * 
	 * @return WRITEME twheys@gmail.com
	 */
	public ThemeItem getCurrentlySelectedAvatarBackground () {
		return itemsByType.get (ThemeItemType.avatarBG).get (
				Integer.valueOf (avatarBackgroundsTracker));
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getCurrentlySelectedBoxStyle WRITEME...
	 * 
	 * @return WRITEME twheys@gmail.com
	 */
	public ThemeItem getCurrentlySelectedBoxStyle () {
		return itemsByType.get (ThemeItemType.boxStyle).get (
				Integer.valueOf (boxStylesTracker));
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getCurrentlySelectedIcon WRITEME...
	 * 
	 * @return WRITEME twheys@gmail.com
	 */
	public ThemeItem getCurrentlySelectedIcon () {
		return itemsByType.get (ThemeItemType.icon).get (
				Integer.valueOf (iconsTracker));
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getCurrentlySelectPageBackground WRITEME...
	 * 
	 * @return WRITEME twheys@gmail.com
	 */
	public ThemeItem getCurrentlySelectedPageBackground () {
		return itemsByType.get (ThemeItemType.pageBG).get (
				Integer.valueOf (pageBackgroundsTracker));
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getCurrentlySelectedTitleBackground WRITEME...
	 * 
	 * @return WRITEME twheys@gmail.com
	 */
	public ThemeItem getCurrentlySelectedTitleBackground () {
		return itemsByType.get (ThemeItemType.titleBG).get (
				Integer.valueOf (titleBackgroundsTracker));
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getNextAvatarBackground WRITEME...
	 * 
	 * @param moveForward WRITEME twheys@gmail.com
	 * @return WRITEME twheys@gmail.com
	 * @throws NotFoundException WRITEME twheys@gmail.com
	 */
	public ThemeItem getNextAvatarBackground (final boolean moveForward)
		throws NotFoundException {
		final int size = itemsByType.get (ThemeItemType.avatarBG)
				.size ();
		if (1 == size) {
			throw new NotFoundException ("No more avatar backgrounds");
		}
		avatarBackgroundsTracker = getNextForTracker (
				avatarBackgroundsTracker, size, moveForward);
		return getCurrentlySelectedAvatarBackground ();
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getNextBoxStyle WRITEME...
	 * 
	 * @param moveForward WRITEME twheys@gmail.com
	 * @return WRITEME twheys@gmail.com WRITEME twheys@gmail.com
	 * @throws NotFoundException WRITEME twheys@gmail.com
	 */
	public ThemeItem getNextBoxStyle (final boolean moveForward)
		throws NotFoundException {
		final int size = itemsByType.get (ThemeItemType.boxStyle)
				.size ();
		if (1 == size) {
			throw new NotFoundException ("No more box styles");
		}
		boxStylesTracker = getNextForTracker (boxStylesTracker, size,
				moveForward);
		return getCurrentlySelectedBoxStyle ();
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getNextForTracker WRITEME...
	 * 
	 * @param tracker WRITEME twheys@gmail.com
	 * @param sizeOfMap WRITEME twheys@gmail.com
	 * @param moveForward WRITEME twheys@gmail.com
	 * @return WRITEME twheys@gmail.com
	 */
	private int getNextForTracker (final int tracker,
			final int sizeOfMap, final boolean moveForward) {
		int modifiedTracker = tracker;
		if (moveForward) {
			++modifiedTracker;
			if (modifiedTracker > sizeOfMap - 1) {
				return 0;
			}
		} else {
			--modifiedTracker;
			if (modifiedTracker < 0) {
				return sizeOfMap - 1;
			}
		}
		return modifiedTracker;
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getNextIcon WRITEME...
	 * 
	 * @param moveForward WRITEME twheys@gmail.com
	 * @return WRITEME twheys@gmail.com
	 * @throws NotFoundException WRITEME twheys@gmail.com
	 */
	public ThemeItem getNextIcon (final boolean moveForward)
		throws NotFoundException {
		final int size = itemsByType.get (ThemeItemType.icon).size ();
		if (1 == size) {
			throw new NotFoundException ("No more icons");
		}
		iconsTracker = getNextForTracker (iconsTracker, size,
				moveForward);
		return getCurrentlySelectedIcon ();
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getNextPageBackground WRITEME...
	 * 
	 * @param moveForward WRITEME twheys@gmail.com
	 * @return WRITEME twheys@gmail.com
	 * @throws NotFoundException WRITEME twheys@gmail.com
	 */
	public ThemeItem getNextPageBackground (final boolean moveForward)
		throws NotFoundException {
		final int size = itemsByType.get (ThemeItemType.pageBG).size ();
		if (1 == size) {
			throw new NotFoundException ("No more page backgrounds");
		}
		pageBackgroundsTracker = getNextForTracker (
				pageBackgroundsTracker, size, moveForward);
		return getCurrentlySelectedPageBackground ();
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO getNextTitleBackground WRITEME...
	 * 
	 * @param moveForward WRITEME twheys@gmail.com
	 * @return WRITEME twheys@gmail.com
	 * @throws NotFoundException WRITEME twheys@gmail.com
	 */
	public ThemeItem getNextTitleBackground (final boolean moveForward)
		throws NotFoundException {
		final int size = itemsByType.get (ThemeItemType.titleBG)
				.size ();
		if (1 == size) {
			throw new NotFoundException ("No more title backgrounds");
		}
		titleBackgroundsTracker = getNextForTracker (
				titleBackgroundsTracker, size, moveForward);
		return getCurrentlySelectedTitleBackground ();
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO initItemMaps WRITEME...
	 */
	private void initItemMaps () {
		for (final HashMap <Integer, ThemeItem> map : itemsByType
				.values ()) {
			map.clear ();
		}
	}

	/**
	 * WRITEME brpocock@star-hope.org Jul 29, 2010
	 * 
	 * @param keys WRITEME
	 * @return WRITEME
	 */
	private int nextKey (final Collection <Integer> keys) {
		int nextKey = 0;
		final Iterator <Integer> key = keys.iterator ();
		while (key.hasNext ()) {
			final Integer aKey = key.next ();
			if (aKey.intValue () > nextKey) {
				++nextKey;
			}
		}
		return nextKey;
	}
}
