/*
 * Copyright 2011 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit.wicket;

import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;

import org.apache.wicket.Application;
import org.apache.wicket.Request;
import org.apache.wicket.Response;
import org.apache.wicket.Session;
import org.apache.wicket.application.IClassResolver;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.protocol.http.WebApplication;

import ro.fortsoft.pf4j.PluginState;
import ro.fortsoft.pf4j.PluginWrapper;

import com.gitblit.IStoredSettings;
import com.gitblit.Keys;
import com.gitblit.extensions.GitblitWicketPlugin;
import com.gitblit.manager.IAuthenticationManager;
import com.gitblit.manager.IFederationManager;
import com.gitblit.manager.IGitblit;
import com.gitblit.manager.INotificationManager;
import com.gitblit.manager.IPluginManager;
import com.gitblit.manager.IProjectManager;
import com.gitblit.manager.IRepositoryManager;
import com.gitblit.manager.IRuntimeManager;
import com.gitblit.manager.IServicesManager;
import com.gitblit.manager.IUserManager;
import com.gitblit.tickets.ITicketService;
import com.gitblit.transport.ssh.IPublicKeyManager;
import com.gitblit.utils.XssFilter;
import com.gitblit.wicket.pages.ActivityPage;
import com.gitblit.wicket.pages.BlamePage;
import com.gitblit.wicket.pages.BlobDiffPage;
import com.gitblit.wicket.pages.BlobPage;
import com.gitblit.wicket.pages.BranchesPage;
import com.gitblit.wicket.pages.CommitDiffPage;
import com.gitblit.wicket.pages.CommitPage;
import com.gitblit.wicket.pages.ComparePage;
import com.gitblit.wicket.pages.DocPage;
import com.gitblit.wicket.pages.DocsPage;
import com.gitblit.wicket.pages.EditMilestonePage;
import com.gitblit.wicket.pages.EditRepositoryPage;
import com.gitblit.wicket.pages.EditTicketPage;
import com.gitblit.wicket.pages.ExportTicketPage;
import com.gitblit.wicket.pages.FederationRegistrationPage;
import com.gitblit.wicket.pages.ForkPage;
import com.gitblit.wicket.pages.ForksPage;
import com.gitblit.wicket.pages.GitSearchPage;
import com.gitblit.wicket.pages.HistoryPage;
import com.gitblit.wicket.pages.LogPage;
import com.gitblit.wicket.pages.LogoutPage;
import com.gitblit.wicket.pages.LuceneSearchPage;
import com.gitblit.wicket.pages.MetricsPage;
import com.gitblit.wicket.pages.MyDashboardPage;
import com.gitblit.wicket.pages.MyTicketsPage;
import com.gitblit.wicket.pages.NewMilestonePage;
import com.gitblit.wicket.pages.NewRepositoryPage;
import com.gitblit.wicket.pages.NewTicketPage;
import com.gitblit.wicket.pages.OverviewPage;
import com.gitblit.wicket.pages.PatchPage;
import com.gitblit.wicket.pages.ProjectPage;
import com.gitblit.wicket.pages.ProjectsPage;
import com.gitblit.wicket.pages.ReflogPage;
import com.gitblit.wicket.pages.RepositoriesPage;
import com.gitblit.wicket.pages.ReviewProposalPage;
import com.gitblit.wicket.pages.SummaryPage;
import com.gitblit.wicket.pages.TagPage;
import com.gitblit.wicket.pages.TagsPage;
import com.gitblit.wicket.pages.TeamsPage;
import com.gitblit.wicket.pages.TicketsPage;
import com.gitblit.wicket.pages.TreePage;
import com.gitblit.wicket.pages.UserPage;
import com.gitblit.wicket.pages.UsersPage;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;

@Singleton
public class GitBlitWebApp extends WebApplication implements GitblitWicketApp {

	private final Class<? extends WebPage> homePageClass = MyDashboardPage.class;

	private final Class<? extends WebPage> newRepositoryPageClass = NewRepositoryPage.class;

	private final Map<String, CacheControl> cacheablePages = new HashMap<String, CacheControl>();

	private final Provider<IPublicKeyManager> publicKeyManagerProvider;

	private final Provider<ITicketService> ticketServiceProvider;

	private final IStoredSettings settings;

	private final XssFilter xssFilter;

	private final IRuntimeManager runtimeManager;

	private final IPluginManager pluginManager;

	private final INotificationManager notificationManager;

	private final IUserManager userManager;

	private final IAuthenticationManager authenticationManager;

	private final IRepositoryManager repositoryManager;

	private final IProjectManager projectManager;

	private final IFederationManager federationManager;

	private final IGitblit gitblit;

	private final IServicesManager services;

	@Inject
	public GitBlitWebApp(
			Provider<IPublicKeyManager> publicKeyManagerProvider,
			Provider<ITicketService> ticketServiceProvider,
			IRuntimeManager runtimeManager,
			IPluginManager pluginManager,
			INotificationManager notificationManager,
			IUserManager userManager,
			IAuthenticationManager authenticationManager,
			IRepositoryManager repositoryManager,
			IProjectManager projectManager,
			IFederationManager federationManager,
			IGitblit gitblit,
			IServicesManager services) {

		super();
		this.publicKeyManagerProvider = publicKeyManagerProvider;
		this.ticketServiceProvider = ticketServiceProvider;
		this.settings = runtimeManager.getSettings();
		this.xssFilter = runtimeManager.getXssFilter();
		this.runtimeManager = runtimeManager;
		this.pluginManager = pluginManager;
		this.notificationManager = notificationManager;
		this.userManager = userManager;
		this.authenticationManager = authenticationManager;
		this.repositoryManager = repositoryManager;
		this.projectManager = projectManager;
		this.federationManager = federationManager;
		this.gitblit = gitblit;
		this.services = services;
	}

	@Override
	public void init() {
		super.init();

		// Setup page authorization mechanism
		boolean useAuthentication = settings.getBoolean(Keys.web.authenticateViewPages, false)
				|| settings.getBoolean(Keys.web.authenticateAdminPages, false);
		if (useAuthentication) {
			AuthorizationStrategy authStrategy = new AuthorizationStrategy(settings, homePageClass);
			getSecuritySettings().setAuthorizationStrategy(authStrategy);
			getSecuritySettings().setUnauthorizedComponentInstantiationListener(authStrategy);
		}

		// Grab Browser info (like timezone, etc)
		if (settings.getBoolean(Keys.web.useClientTimezone, false)) {
			getRequestCycleSettings().setGatherExtendedBrowserInfo(true);
		}

		// configure the resource cache duration to 90 days for deployment
		if (!isDebugMode()) {
			getResourceSettings().setDefaultCacheDuration(90 * 86400);
		}

		// setup the standard gitweb-ish urls
		mount("/repositories", RepositoriesPage.class);
		mount("/overview", OverviewPage.class, "r", "h");
		mount("/summary", SummaryPage.class, "r");
		mount("/reflog", ReflogPage.class, "r", "h");
		mount("/commits", LogPage.class, "r", "h");
		mount("/log", LogPage.class, "r", "h");
		mount("/tags", TagsPage.class, "r");
		mount("/branches", BranchesPage.class, "r");
		mount("/commit", CommitPage.class, "r", "h");
		mount("/tag", TagPage.class, "r", "h");
		mount("/tree", TreePage.class, "r", "h", "f");
		mount("/blob", BlobPage.class, "r", "h", "f");
		mount("/blobdiff", BlobDiffPage.class, "r", "h", "f");
		mount("/commitdiff", CommitDiffPage.class, "r", "h");
		mount("/compare", ComparePage.class, "r", "h");
		mount("/patch", PatchPage.class, "r", "h", "f");
		mount("/history", HistoryPage.class, "r", "h", "f");
		mount("/search", GitSearchPage.class);
		mount("/metrics", MetricsPage.class, "r");
		mount("/blame", BlamePage.class, "r", "h", "f");
		mount("/users", UsersPage.class);
		mount("/teams", TeamsPage.class);
		mount("/logout", LogoutPage.class);

		// setup ticket urls
		mount("/tickets", TicketsPage.class, "r", "h");
		mount("/tickets/new", NewTicketPage.class, "r");
		mount("/tickets/edit", EditTicketPage.class, "r", "h");
		mount("/tickets/export", ExportTicketPage.class, "r", "h");
		mount("/milestones/new", NewMilestonePage.class, "r");
		mount("/milestones/edit", EditMilestonePage.class, "r", "h");
		mount("/mytickets", MyTicketsPage.class, "r", "h");

		// setup the markup document urls
		mount("/docs", DocsPage.class, "r");
		mount("/doc", DocPage.class, "r", "h", "f");

		// federation urls
		mount("/proposal", ReviewProposalPage.class, "t");
		mount("/registration", FederationRegistrationPage.class, "u", "n");

		mount("/new", NewRepositoryPage.class);
		mount("/edit", EditRepositoryPage.class, "r");
		mount("/activity", ActivityPage.class, "r", "h");
		mount("/lucene", LuceneSearchPage.class);
		mount("/project", ProjectPage.class, "p");
		mount("/projects", ProjectsPage.class);
		mount("/user", UserPage.class, "user");
		mount("/forks", ForksPage.class, "r");
		mount("/fork", ForkPage.class, "r");

		// allow started Wicket plugins to initialize
		for (PluginWrapper pluginWrapper : pluginManager.getPlugins()) {
			if (PluginState.STARTED != pluginWrapper.getPluginState()) {
				continue;
			}
			if (pluginWrapper.getPlugin() instanceof GitblitWicketPlugin) {
				GitblitWicketPlugin wicketPlugin = (GitblitWicketPlugin) pluginWrapper.getPlugin();
				wicketPlugin.init(this);
			}
		}

		 // customize the Wicket class resolver to load from plugins
		IClassResolver coreResolver = getApplicationSettings().getClassResolver();
        PluginClassResolver classResolver = new PluginClassResolver(coreResolver, pluginManager);
        getApplicationSettings().setClassResolver(classResolver);

		getMarkupSettings().setDefaultMarkupEncoding("UTF-8");
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#mount(java.lang.String, java.lang.Class, java.lang.String)
	 */
	@Override
	public void mount(String location, Class<? extends WebPage> clazz, String... parameters) {
		if (parameters == null) {
			parameters = new String[] {};
		}
		if (!settings.getBoolean(Keys.web.mountParameters, true)) {
			parameters = new String[] {};
		}
		mount(new GitblitParamUrlCodingStrategy(settings, xssFilter, location, clazz, parameters));

		// map the mount point to the cache control definition
		if (clazz.isAnnotationPresent(CacheControl.class)) {
			CacheControl cacheControl = clazz.getAnnotation(CacheControl.class);
			cacheablePages.put(location.substring(1), cacheControl);
		}
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#getHomePage()
	 */
	@Override
	public Class<? extends WebPage> getHomePage() {
		return homePageClass;
	}

	public Class<? extends WebPage> getNewRepositoryPage() {
		return newRepositoryPageClass;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#isCacheablePage(java.lang.String)
	 */
	@Override
	public boolean isCacheablePage(String mountPoint) {
		return cacheablePages.containsKey(mountPoint);
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#getCacheControl(java.lang.String)
	 */
	@Override
	public CacheControl getCacheControl(String mountPoint) {
		return cacheablePages.get(mountPoint);
	}

	@Override
	public final Session newSession(Request request, Response response) {
		GitBlitWebSession gitBlitWebSession = new GitBlitWebSession(request);

		Locale forcedLocale = runtime().getLocale();
		if (forcedLocale != null) {
			gitBlitWebSession.setLocale(forcedLocale);
		}
		return gitBlitWebSession;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#settings()
	 */
	@Override
	public IStoredSettings settings() {
		return settings;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#xssFilter()
	 */
	@Override
	public XssFilter xssFilter() {
		return xssFilter;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#isDebugMode()
	 */
	@Override
	public boolean isDebugMode() {
		return runtimeManager.isDebugMode();
	}

	/*
	 * These methods look strange... and they are... but they are the first
	 * step towards modularization across multiple commits.
	 */
	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#getBootDate()
	 */
	@Override
	public Date getBootDate() {
		return runtimeManager.getBootDate();
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#getLastActivityDate()
	 */
	@Override
	public Date getLastActivityDate() {
		return repositoryManager.getLastActivityDate();
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#runtime()
	 */
	@Override
	public IRuntimeManager runtime() {
		return runtimeManager;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#plugins()
	 */
	@Override
	public IPluginManager plugins() {
		return pluginManager;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#notifier()
	 */
	@Override
	public INotificationManager notifier() {
		return notificationManager;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#users()
	 */
	@Override
	public IUserManager users() {
		return userManager;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#authentication()
	 */
	@Override
	public IAuthenticationManager authentication() {
		return authenticationManager;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#keys()
	 */
	@Override
	public IPublicKeyManager keys() {
		return publicKeyManagerProvider.get();
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#repositories()
	 */
	@Override
	public IRepositoryManager repositories() {
		return repositoryManager;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#projects()
	 */
	@Override
	public IProjectManager projects() {
		return projectManager;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#federation()
	 */
	@Override
	public IFederationManager federation() {
		return federationManager;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#gitblit()
	 */
	@Override
	public IGitblit gitblit() {
		return gitblit;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#services()
	 */
	@Override
	public IServicesManager services() {
		return services;
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#tickets()
	 */
	@Override
	public ITicketService tickets() {
		return ticketServiceProvider.get();
	}

	/* (non-Javadoc)
	 * @see com.gitblit.wicket.Webapp#getTimezone()
	 */
	@Override
	public TimeZone getTimezone() {
		return runtimeManager.getTimezone();
	}

	@Override
	public final String getConfigurationType() {
		if (runtimeManager.isDebugMode()) {
			return Application.DEVELOPMENT;
		}
		return Application.DEPLOYMENT;
	}

	public static GitBlitWebApp get() {
		return (GitBlitWebApp) WebApplication.get();
	}
}
