/*
 * Copyright 2012 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.pages;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.wicket.Component;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.ExternalLink;

import com.gitblit.Keys;
import com.gitblit.models.Menu.MenuDivider;
import com.gitblit.models.Menu.MenuItem;
import com.gitblit.models.Menu.ParameterMenuItem;
import com.gitblit.models.NavLink.DropDownPageMenuNavLink;
import com.gitblit.models.NavLink;
import com.gitblit.models.ProjectModel;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.UserModel;
import com.gitblit.servlet.SyndicationServlet;
import com.gitblit.utils.MarkdownUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.CacheControl;
import com.gitblit.wicket.CacheControl.LastModified;
import com.gitblit.wicket.GitBlitWebApp;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.GitblitRedirectException;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.panels.FilterableRepositoryList;

@CacheControl(LastModified.PROJECT)
public class ProjectPage extends DashboardPage {

	List<ProjectModel> projectModels = new ArrayList<ProjectModel>();

	public ProjectPage() {
		super();
		throw new GitblitRedirectException(GitBlitWebApp.get().getHomePage());
	}

	public ProjectPage(PageParameters params) {
		super(params);
		setup(params);
	}

	@Override
	protected Class<? extends BasePage> getRootNavPageClass() {
		return RepositoriesPage.class;
	}

	@Override
	protected void setLastModified() {
		if (getClass().isAnnotationPresent(CacheControl.class)) {
			CacheControl cacheControl = getClass().getAnnotation(CacheControl.class);
			switch (cacheControl.value()) {
			case PROJECT:
				String projectName = WicketUtils.getProjectName(getPageParameters());
				if (!StringUtils.isEmpty(projectName)) {
					ProjectModel project = getProjectModel(projectName);
					if (project != null) {
						setLastModified(project.lastChange);
					}
				}
				break;
			default:
				super.setLastModified();
			}
		}
	}

	private void setup(PageParameters params) {
		setupPage("", "");
		// check to see if we should display a login message
		boolean authenticateView = app().settings().getBoolean(Keys.web.authenticateViewPages, true);
		if (authenticateView && !GitBlitWebSession.get().isLoggedIn()) {
			authenticationError("Please login");
			return;
		}

		String projectName = params == null ? null : WicketUtils.getProjectName(params);
		if (StringUtils.isEmpty(projectName)) {
			throw new GitblitRedirectException(GitBlitWebApp.get().getHomePage());
		}

		ProjectModel project = getProjectModel(projectName);
		if (project == null) {
			throw new GitblitRedirectException(GitBlitWebApp.get().getHomePage());
		}

		add(new Label("projectTitle", project.getDisplayName()));
		add(new Label("projectDescription", project.description));

		String feedLink = SyndicationServlet.asLink(getRequest().getRelativePathPrefixToContextRoot(), projectName, null, 0);
		add(new ExternalLink("syndication", feedLink));

		add(WicketUtils.syndicationDiscoveryLink(SyndicationServlet.getTitle(project.getDisplayName(),
				null), feedLink));

		// project markdown message
		String pmessage = transformMarkdown(project.projectMarkdown);
		Component projectMessage = new Label("projectMessage", pmessage)
				.setEscapeModelStrings(false).setVisible(pmessage.length() > 0);
		add(projectMessage);

		// markdown message above repositories list
		String rmessage = transformMarkdown(project.repositoriesMarkdown);
		Component repositoriesMessage = new Label("repositoriesMessage", rmessage)
				.setEscapeModelStrings(false).setVisible(rmessage.length() > 0);
		add(repositoriesMessage);

		UserModel user = GitBlitWebSession.get().getUser();
		if (user == null) {
			user = UserModel.ANONYMOUS;
		}
		int daysBack = params == null ? 0 : WicketUtils.getDaysBack(params);
		if (daysBack < 1) {
			daysBack = app().settings().getInteger(Keys.web.activityDuration, 7);
		}
		// reset the daysback parameter so that we have a complete project
		// repository list.  the recent activity will be built up by the
		// reflog utils.
		if (params != null) {
			params.remove("db");
		}

		List<RepositoryModel> repositories = getRepositories(params);
		Collections.sort(repositories, new Comparator<RepositoryModel>() {
			@Override
			public int compare(RepositoryModel o1, RepositoryModel o2) {
				// reverse-chronological sort
				return o2.lastChange.compareTo(o1.lastChange);
			}
		});

		addActivity(user, repositories, getString("gb.recentActivity"), daysBack);

		if (repositories.isEmpty()) {
			add(new Label("repositoryList").setVisible(false));
		} else {
			FilterableRepositoryList repoList = new FilterableRepositoryList("repositoryList", repositories);
			repoList.setAllowCreate(user.canCreate(project.name + "/"));
			add(repoList);
		}
	}

	@Override
	protected void addDropDownMenus(List<NavLink> navLinks) {
		PageParameters params = getPageParameters();

		DropDownPageMenuNavLink menu = new DropDownPageMenuNavLink("gb.filters",
				ProjectPage.class);
		// preserve time filter option on repository choices
		menu.menuItems.addAll(getRepositoryFilterItems(params));

		// preserve repository filter option on time choices
		menu.menuItems.addAll(getTimeFilterItems(params));

		if (menu.menuItems.size() > 0) {
			// Reset Filter
			menu.menuItems.add(new ParameterMenuItem(getString("gb.reset"), "p", WicketUtils.getProjectName(params)));
		}

		navLinks.add(menu);

		DropDownPageMenuNavLink projects = new DropDownPageMenuNavLink("gb.projects",
				ProjectPage.class);
		projects.menuItems.addAll(getProjectsMenu());
		navLinks.add(projects);
	}

	@Override
	protected List<ProjectModel> getProjectModels() {
		if (projectModels.isEmpty()) {
			List<RepositoryModel> repositories = getRepositoryModels();
			List<ProjectModel> projects = app().projects().getProjectModels(repositories, false);
			projectModels.addAll(projects);
		}
		return projectModels;
	}

	private ProjectModel getProjectModel(String name) {
		for (ProjectModel project : getProjectModels()) {
			if (name.equalsIgnoreCase(project.name)) {
				return project;
			}
		}
		return null;
	}

	protected List<MenuItem> getProjectsMenu() {
		List<MenuItem> menu = new ArrayList<MenuItem>();
		List<ProjectModel> projects = new ArrayList<ProjectModel>();
		for (ProjectModel model : getProjectModels()) {
			if (!model.isUserProject()) {
				projects.add(model);
			}
		}
		int maxProjects = 15;
		boolean showAllProjects = projects.size() > maxProjects;
		if (showAllProjects) {

			// sort by last changed
			Collections.sort(projects, new Comparator<ProjectModel>() {
				@Override
				public int compare(ProjectModel o1, ProjectModel o2) {
					return o2.lastChange.compareTo(o1.lastChange);
				}
			});

			// take most recent subset
			projects = projects.subList(0, maxProjects);

			// sort those by name
			Collections.sort(projects);
		}

		for (ProjectModel project : projects) {
			menu.add(new ParameterMenuItem(project.getDisplayName(), "p", project.name));
		}
		if (showAllProjects) {
			menu.add(new MenuDivider());
			menu.add(new ParameterMenuItem("all projects"));
		}
		return menu;
	}

	private String transformMarkdown(String markdown) {
		String message = "";
		if (!StringUtils.isEmpty(markdown)) {
			// Read user-supplied message
			try {
				message = MarkdownUtils.transformMarkdown(markdown);
			} catch (Throwable t) {
				message = getString("gb.failedToRead") + " " + markdown;
				warn(message, t);
			}
		}
		return message;
	}
}
