/*
 * Copyright 2013 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.manager;

import java.util.Collection;

import com.gitblit.GitBlitException;
import com.gitblit.models.GitClientApplication;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.TeamModel;
import com.gitblit.models.UserModel;
import com.gitblit.tickets.ITicketService;
import com.gitblit.transport.ssh.IPublicKeyManager;

public interface IGitblit extends IManager,
									IRuntimeManager,
									IPluginManager,
									INotificationManager,
									IUserManager,
									IAuthenticationManager,
									IRepositoryManager,
									IProjectManager,
									IFederationManager {

	/**
	 * Creates a complete user object.
	 *
	 * @param user
	 * @param isCreate
	 * @throws GitBlitException
	 * @since 1.4.0
	 */
	void addUser(UserModel user) throws GitBlitException;

	/**
	 * Updates a complete user object keyed by username. This method allows
	 * for renaming a user.
	 *
	 * @param username
	 * @param user
	 * @throws GitBlitException
	 * @since 1.4.0
	 */
	void reviseUser(String username, UserModel user) throws GitBlitException;

	/**
	 * Creates a TeamModel object.
	 *
	 * @param team
	 * @param isCreate
	 * @since 1.4.0
	 */
	void addTeam(TeamModel team) throws GitBlitException;

	/**
	 * Updates the TeamModel object for the specified name.
	 *
	 * @param teamname
	 * @param team
	 * @since 1.4.0
	 */
	void reviseTeam(String teamname, TeamModel team) throws GitBlitException;

	/**
	 * Creates a personal fork of the specified repository. The clone is view
	 * restricted by default and the owner of the source repository is given
	 * access to the clone.
	 *
	 * @param repository
	 * @param user
	 * @return the repository model of the fork, if successful
	 * @throws GitBlitException
	 * @since 1.4.0
	 */
	RepositoryModel fork(RepositoryModel repository, UserModel user) throws GitBlitException;

	/**
	 * Returns the list of custom client applications to be used for the
	 * repository url panel;
	 *
	 * @return a collection of client applications
	 * @since 1.4.0
	 */
	Collection<GitClientApplication> getClientApplications();

	/**
	 * Returns the ticket service.
	 *
	 * @return a ticket service
	 * @since 1.4.0
	 */
	ITicketService getTicketService();

	/**
	 * Returns the SSH public key manager.
	 *
	 * @return the SSH public key manager
	 * @since 1.5.0
	 */
	IPublicKeyManager getPublicKeyManager();

}