import java.sql.Connection;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import com.cognos.CAM_AAA.authentication.UnrecoverableException;

public class AccountCache
{

	private final Map< String, Account > accounts = new HashMap< String, Account >();

	private final Connection connection;
	
	public static final String TENANTID_ACCOUNT_PROPERTY = "tenant";

	public AccountCache(final ConnectionManager connectionManager)
	{
		this.connection = connectionManager.getConnection();
	}

	private Account createAccount(final String userID) throws UnrecoverableException
	{
		final Account account = new Account(userID);
		this.setAccountProperties(account);

		this.accounts.put(userID, account);

		return account;
	}

	public synchronized Account findAccount(final String userID) throws UnrecoverableException
	{
		Account account = this.accounts.get(userID);
		if (null == account)
			account = this.createAccount(userID);

		return account;
	}

	private void setAccountProperties(final Account account) throws UnrecoverableException
	{
		final String userIDStr = account.getObjectID();
		final Integer userID = Integer.parseInt(userIDStr.substring(2));

		final Object[][] data =
				QueryUtil.query(this.connection, "SELECT USERNAME, FULLNAME, LOCALE, TENANT FROM USERS WHERE USERID = ?", userID);
		if (1 > data.length)
			return;

		final Object[] row = data[0];
		account.setUserName((String) row[0]);

		final Locale locale = QueryUtil.getLocale((String) row[2]);
		account.setContentLocale(locale);
		account.setProductLocale(locale);

		account.addName(locale, (String) row[1]);
		
		setTenantId(account, row[3].toString());
	}
	
	/**
	 *	To configure Multi-tenancy, the following advanced properties must be added via the Configuration Tool
	 *
	 *	Name							Value 
	 *  ==============================	======
	 *	multitenancy.TenantPattern		~/parameters/tenant
	 *
	 *	Refer to Tenant Patterns within Multi-Tenancy product documentation for details
	 */
	private void setTenantId(Account account, String tenantId) {
		account.addCustomProperty(TENANTID_ACCOUNT_PROPERTY, tenantId);
	}
}