package org.github.etcd.viewer.html.pages;

import org.apache.wicket.Page;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.devutils.debugbar.DebugBar;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.WebMarkupContainer;
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.panel.EmptyPanel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.github.etcd.viewer.html.resource.WebResources;

public class TemplatePage extends WebPage {

    private static final long serialVersionUID = 1L;

    public TemplatePage() {
        super();
        createPage();
    }

    public TemplatePage(IModel<?> model) {
        super(model);
        createPage();
    }

    public TemplatePage(PageParameters parameters) {
        super(parameters);
        createPage();
    }

    protected IModel<?> getPageTitleModel() {
        return new StringResourceModel("page.title", this, getDefaultModel(), getDefaultPageTitle());
    }

    protected String getDefaultPageTitle() {
        return "etcd viewer";
    }

    private Label title;

    protected SelectRegistryPanel selectRegistryPanel;

    private void createPage() {

        add(title = new Label("title", new LoadableDetachableModel<Object>() {
            private static final long serialVersionUID = 1L;
            @Override
            protected Object load() {
                return getPageTitleModel().getObject();
            }
        }));

        title.setOutputMarkupId(true);

        if (getApplication().getDebugSettings().isDevelopmentUtilitiesEnabled()) {
            add(new DebugBar("debug"));
        } else {
            add(new EmptyPanel("debug").setVisible(false));
        }

        add(createMenuItem("homeMenuItem", "home", HomePage.class));
        add(createMenuItem("aboutMenuItem", "about", AboutPage.class));

        add(selectRegistryPanel = new SelectRegistryPanel("selectRegistry"));
        selectRegistryPanel.setOutputMarkupId(true);

        add(new SignInPanel("authPanel"));
        add(new SignOutPanel("signOut"));
    }

    private <C extends Page> WebMarkupContainer createMenuItem(String menuId, String linkId, final Class<C> pageClass) {
        WebMarkupContainer menuItem = new WebMarkupContainer(menuId) {
            private static final long serialVersionUID = 1L;
            @Override
            protected void onConfigure() {
                super.onConfigure();
                if (getPageClass().equals(pageClass)) {
                    add(AttributeAppender.append("class", "active"));
                }
            }
        };
        menuItem.add(new BookmarkablePageLink<>(linkId, pageClass));
        return menuItem;
    }

    protected void updatePageTitle(AjaxRequestTarget target) {
        target.add(title);
    }

    @Override
    public void renderHead(IHeaderResponse response) {
        super.renderHead(response);

        WebResources.renderBootstrapHeader(response);
        WebResources.renderBootstrapThemeHeader(response);
        WebResources.renderFontAwesomeHeader(response);
    }

}