package org.aegee.runanddine;

import java.util.List;
import java.util.TreeMap;

import org.aegee.runanddine.advertisement.AdvertisementManager;
import org.aegee.runanddine.archive.ArchivePage;
import org.aegee.runanddine.feedback.FeedbackOverviewPage;
import org.aegee.runanddine.feedback.GracefulMailOfThanksMailTemplateEditor;
import org.aegee.runanddine.information.InformationMailTemplateEditor;
import org.aegee.runanddine.registrationvalidation.RegistrationValidationMailTemplateEditor;
import org.aegee.runanddine.runanddine.RunAndDineManager;
import org.aegee.runanddine.util.data.ModelNotExistingException;
import org.aegee.runanddine.util.model.Model;
import org.aegee.runanddine.util.model.ModelManager;
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.link.Link;
import org.apache.wicket.markup.html.link.PopupSettings;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException;
import org.apache.wicket.request.mapper.parameter.PageParameters;

/**
 * Superclass for all backend pages
 */
public class BasePage extends WebPage {

    /**
     * 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", BasePage.class);
        links.put("nav_rundine", RunAndDineManager.class);
        links.put("nav_ad", AdvertisementManager.class);
        links.put("nav_info", InformationMailTemplateEditor.class);
        links.put("nav_feedback", FeedbackOverviewPage.class);
        links.put("nav_grace", GracefulMailOfThanksMailTemplateEditor.class);
        links.put("nav_regval", RegistrationValidationMailTemplateEditor.class);
        links.put("nav_archive", ArchivePage.class);
    }

    /**
     * Page constructor
     * @param parameters HTTP parameters
     */
    public BasePage(PageParameters parameters) {
        super(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 org.apache.wicket.model.Model("active")));
            }
            this.add(li);
        }
    }

    /**
     * Return page title
     * @return Page title
     */
    protected String getTitle() {
        return "RunAndDine WebApp Organizer Panel";
    }

    /**
     * checks wether
     * <code>new=true</code> is contained in url get data. In this case a new
     * object is returned. Otherwise the provided manager is used to query an
     * object by the provided id in the get data.
     *
     * @param parameters
     * @return
     * @throws AbortWithHttpErrorCodeException if the query fails
     */
    protected boolean createNew() {
        return super.getPageParameters().get("new").toBoolean();
    }

    /**
     * Get model by id in page parameters if it exists,
     * otherwise create new model
     * @param <T> A type extending Model
     * @param man ModelManager for corresponding model type
     * @return Existing or new model
     */
    protected <T extends Model> T getObjectOrNew(ModelManager<T> man) {
        if (this.createNew()) {
            return man.newObject();
        } else {
            try {
                return man.getById(super.getPageParameters().get("id").toInteger());
            } catch (ModelNotExistingException e) {
                e.printStackTrace();
                throw new AbortWithHttpErrorCodeException(500, "No such Object.");
            }
        }
    }

    /**
     * Create popup to for creating abstract mails with a list of keys
     * @param id HTML identifier
     * @param availableKeys Keys available for template
     * @return Link for popup
     */
    public static Link createHowToWriteAnAbstractMailPopup(String id, final List<String> availableKeys) {
        //BookmarkablePageLink howToLink = new BookmarkablePageLink(id, HowToWriteAnAbstractMailPage.class, new PageParameters());
        Link howToLink = new Link(id) {

            @Override
            public void onClick() {
                this.setResponsePage(new HowToWriteAnAbstractMailPage(null, availableKeys));
            }
        };

        PopupSettings popupSettings = new PopupSettings("How to write an abstract Mail?", PopupSettings.SCROLLBARS);
        popupSettings.setHeight(400);
        popupSettings.setWidth(400);
        howToLink.setPopupSettings(popupSettings);
        return howToLink;
    }

    /**
     * Create popup for creating abstract mails without any keys
     * @param id HTML identifier
     * @return Link for popup
     */
    public static Link createHowToWriteAnAbstractMailPopup(String id) {
        return createHowToWriteAnAbstractMailPopup(id, null);
    }
}
