/*
 * 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");
		mount("/summary", SummaryPage.class, "r");
		mount("/reflog", ReflogPage.class, "r");
		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", "h");
		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();
	}
}
