package org.aegee.runanddine;

import java.util.Date;
import java.util.TreeMap;

import org.aegee.runanddine.registration.GroupRegistrationPage;
import org.aegee.runanddine.registration.SingleRegistrationPage;
import org.aegee.runanddine.runanddine.RunAndDine;
import org.aegee.runanddine.util.DateFormat;
import org.aegee.runanddine.util.data.ModelNotExistingException;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;

/**
 * Superclass for all frontend pages
 */
public class FrontendBasePage extends WebPage
{

	/**
	 * ID to identify actual version of this class
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Map of all links to be displayed as list
	 */
	private static final TreeMap<String, Class> links = new TreeMap<String, Class>();

	static
	{
		links.put("nav_home", FrontendBasePage.class);
		links.put("nav_single", SingleRegistrationPage.class);
		links.put("nav_group", GroupRegistrationPage.class);
	}

	/**
	 * Page constructor
	 * 
	 * @param parameters
	 *            HTTP parameters
	 */
	public FrontendBasePage(final PageParameters parameters)
	{
		this.add(new Label("title", this.getTitle()));

		// add links to navigation
		for (String key : links.keySet())
		{
			// add list item with link component
			Class cl = links.get(key);
			ListItem li = new ListItem(key, 0);
			BookmarkablePageLink a = new BookmarkablePageLink(key + "_a", cl);
			li.add(a);
			if (this.getClass() == cl)
			{
				li.add(new AttributeAppender("class", new Model("active")));
			}
			this.add(li);
		}

		try
		{
			RunAndDine rd = RunAndDine.OBJECTS.getLatest();
			if (rd == null || !rd.getDate().after(new Date(100, 1, 1)))
			{
				throw new ModelNotExistingException();
			}
			this.add(new Label("date", DateFormat.format(rd.getDate())));
			this.add(new Label("regDate", DateFormat.format(rd.getRegistrationDeadline())));
			this.add(new Label("motto", rd.getMotto()));
		}
		catch (ModelNotExistingException e)
		{
			this.add(new Label("date", "[no current Run&Dine]"));
			this.add(new Label("regDate", "[no current Run&Dine]"));
			this.add(new Label("motto", "[no current Run&Dine]"));
		}
	}

	/**
	 * Return page title
	 * 
	 * @return page title
	 */
	protected String getTitle()
	{
		return "RunAndDine WebApp - Welcome";
	}
}
