/*
 * Copyright 2013 gitblit.com
 * Copyright 2013 Florian Zschocke
 *
 * 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.utils;

import com.gitblit.Constants;


/**
 * Utility functions for model classes that do not fit in any other category.
 *
 * @author Florian Zschocke
 */
public class ModelUtils
{
	private static String userRepoPrefix = Constants.DEFAULT_USER_REPOSITORY_PREFIX;

	/**
	 * Set the user repository prefix.
	 * @param prefix
	 */
	public static void setUserRepoPrefix(String prefix)
	{
		if (StringUtils.isEmpty(prefix)) {
			userRepoPrefix = Constants.DEFAULT_USER_REPOSITORY_PREFIX;
			return;
		}

		String newPrefix = prefix.replace('\\', '/');
		if (prefix.charAt(0) == '/') {
			newPrefix = prefix.substring(1);
		}

		userRepoPrefix = newPrefix;
	}


	/**
	 * Get the active user repository project prefix.
	 */
	public static String getUserRepoPrefix()
	{
		return userRepoPrefix;
	}


	/**
	 * Get the user project name for a user.
	 *
	 * @param username name of user
	 * @return the active user repository project prefix concatenated with the user name
	 */
	public static String getPersonalPath(String username)
	{
		return userRepoPrefix + username.toLowerCase();
	}


	/**
	 * Test if a repository path is for a personal repository.
	 *
	 * @param name
	 * 			A project name, a relative path to a repository.
	 * @return  true, if the name starts with the active user repository project prefix. False, otherwise.
	 */
	public static boolean isPersonalRepository(String name)
	{
		if ( name.startsWith(userRepoPrefix) ) return true;
		return false;
	}


	/**
	 * Test if a repository path is for a personal repository of a specific user.
	 *
	 * @param username
	 * 			Name of a user
	 * @param name
	 * 			A project name, a relative path to a repository.
	 * @return	true, if the name starts with the active user repository project prefix. False, otherwise.
	 */
	public static boolean isUsersPersonalRepository(String username, String name)
	{
		if ( name.equalsIgnoreCase(getPersonalPath(username)) ) return true;
		return false;
	}


	/**
	 * Exrtract a user's name from a personal repository path.
	 *
	 * @param path
	 * 			A project name, a relative path to a repository.
	 * @return  If the path does not point to a personal repository, an empty string is returned.
	 * 			Otherwise the name of the user the personal repository belongs to is returned.
	 */
	public static String getUserNameFromRepoPath(String path)
	{
		if ( !isPersonalRepository(path) ) return "";

		return path.substring(userRepoPrefix.length());
	}

}
