/*
 * Copyright 2014 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.transport.ssh;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Memory public key manager.
 *
 * @author James Moger
 *
 */
public class MemoryKeyManager extends IPublicKeyManager {

	final Map<String, List<SshKey>> keys;

	public MemoryKeyManager() {
		keys = new HashMap<String, List<SshKey>>();
	}

	@Override
	public String toString() {
		return getClass().getSimpleName();
	}

	@Override
	public MemoryKeyManager start() {
		log.info(toString());
		return this;
	}

	@Override
	public boolean isReady() {
		return true;
	}

	@Override
	public MemoryKeyManager stop() {
		return this;
	}

	@Override
	protected boolean isStale(String username) {
		// always return true so we gets keys from our hashmap
		return true;
	}

	@Override
	protected List<SshKey> getKeysImpl(String username) {
		String id = username.toLowerCase();
		if (keys.containsKey(id)) {
			return keys.get(id);
		}
		return null;
	}

	@Override
	public boolean addKey(String username, SshKey key) {
		String id = username.toLowerCase();
		if (!keys.containsKey(id)) {
			keys.put(id, new ArrayList<SshKey>());
		}
		log.info("added {} key {}", username, key.getFingerprint());
		return keys.get(id).add(key);
	}

	@Override
	public boolean removeKey(String username, SshKey key) {
		String id = username.toLowerCase();
		if (!keys.containsKey(id)) {
			log.info("can't remove keys for {}", username);
			return false;
		}
		List<SshKey> list = keys.get(id);
		boolean success = list.remove(key);
		if (success) {
			log.info("removed {} key {}", username, key.getFingerprint());
		}

		if (list.isEmpty()) {
			keys.remove(id);
			log.info("no {} keys left, removed {}", username, username);
		}
		return success;
	}

	@Override
	public boolean removeAllKeys(String username) {
		String id = username.toLowerCase();
		keys.remove(id.toLowerCase());
		log.info("removed all keys for {}", username);
		return true;
	}
}
