/****************************************************************************
 * Copyright (c) 2004 Composent, Inc. and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Composent, Inc. - initial API and implementation
 *****************************************************************************/
package org.eclipse.ecf.presence;

import java.util.Map;

import org.eclipse.ecf.core.util.ECFException;

/**
 * Presence account management interface. Access to instances implementing this
 * interface is provided by calling
 * {@link IPresenceContainerAdapter#getAccountManager()}
 * 
 * @see IPresenceContainerAdapter#getAccountManager()
 */
public interface IAccountManager {

	/**
	 * Change account password to use new password. Upon next authenticated
	 * login, new password will be required for accessing account
	 * 
	 * @param newpassword
	 *            new password to use for this account. Must not be
	 *            <code>null</code>.
	 * @return true if password changed, false if not changed
	 * @throws ECFException
	 *             thrown if not connected, or if password change fails due to
	 *             network failure or server failure
	 */
	public boolean changePassword(String newpassword) throws ECFException;

	/**
	 * Determine whether account creation is supported for this account manager
	 * 
	 * @return true if account creation supported, false otherwise
	 * @throws ECFException
	 *             thrown if not connected, or if query fails due to network
	 *             failure or server failure
	 */
	public boolean isAccountCreationSupported() throws ECFException;

	/**
	 * Create a new account. Create a new account using given username,
	 * password, and attributes. If account creation succeeds, the method will
	 * return successfully. If fails, or is not supported, ECFException will be
	 * thrown
	 * 
	 * @param username
	 *            the fully qualified username to use for the new account. Must
	 *            not be <code>null</code>.
	 * @param password
	 *            the password to use with the new account. Must not be
	 *            <code>null</code>.
	 * @param attributes
	 *            attributes to associate with the new account. May be null.
	 * @return true if account created, false if not created
	 * @throws ECFException
	 *             thrown if account creation is not supported, or if fails for
	 *             some reason (network failure or server failure)
	 */
	public boolean createAccount(String username, String password,
			Map attributes) throws ECFException;

	/**
	 * Delete an account. Deletes this account. If successful deletion, the
	 * method will return successfully. If account deletion is not supported,
	 * network failure, or some server error then an ECFException will be
	 * thrown.
	 * 
	 * @return true if account deleted, false if not deleted
	 * @throws ECFException
	 *             thrown if account deletion is not supported, or if fails for
	 *             some reason (network failure or server failure)
	 */
	public boolean deleteAccount() throws ECFException;

	/**
	 * Get any instructions for account
	 * 
	 * @return instructions for account. May be <code>null</code>.
	 * @throws ECFException
	 *             thrown if account account instructions not supported, or if
	 *             fails for some reason (network failure or server failure)
	 */
	public String getAccountCreationInstructions() throws ECFException;

	/**
	 * Get account attribute names for this account
	 * 
	 * @return String[] attribute names. Will return empty array if no attribute
	 *         names for account.
	 * @throws ECFException
	 *             thrown if get account attribute names not supported, or if
	 *             fails for some reason (network failure or server failure)
	 */
	public String[] getAccountAttributeNames() throws ECFException;

	/**
	 * Get the value of given
	 * 
	 * @param attributeName
	 *            the attribute name to return the value for. Should not be
	 *            <code>null</code>.
	 * @return Object value for the given attribute. Will be <code>null</code>
	 *         if attribute name is not found.
	 * @throws ECFException
	 *             thrown if get account attribute not supported, or if fails
	 *             for some reason (network failure or server failure)
	 */
	public Object getAccountAttribute(String attributeName) throws ECFException;
}
