package de.timroes.axmlrpc;

import java.net.HttpURLConnection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * The CookieManager handles cookies for the http requests.
 * If the FLAGS_ENABLE_COOKIES has been set, it will save cookies
 * and send it with every request.
 *
 * @author Tim Roes
 */
class CookieManager {

	private static final String SET_COOKIE = "Set-Cookie";
	private static final String COOKIE = "Cookie";

	private int flags;
	private Map<String,String> cookies = new ConcurrentHashMap<String, String>();

	/**
	 * Create a new CookieManager with the given flags.
	 *
	 * @param flags A combination of flags to be set.
	 */
	public CookieManager(int flags) {
		this.flags = flags;
	}

	/**
	 * Delete all cookies.
	 */
	public void clearCookies() {
		cookies.clear();
	}

	/**
	 * Returns a {@link Map} of all cookies.
	 * 
	 * @return All cookies
	 */
	public Map<String,String> getCookies() {
		return cookies;
	}
	
	/**
	 * Read the cookies from an http response. It will look at every Set-Cookie
	 * header and put the cookie to the map of cookies.
	 *
	 * @param http A http connection.
	 */
	public void readCookies(HttpURLConnection http) {

		// Only save cookies if FLAGS_ENABLE_COOKIES has been set.
		if((flags & XMLRPCClient.FLAGS_ENABLE_COOKIES) == 0)
			return;

		String cookie, key;
		String[] split;

		// Extract every Set-Cookie field and put the cookie to the cookies map.
		for(int i = 0; i < http.getHeaderFields().size(); i++) {
			key = http.getHeaderFieldKey(i);
			if(key != null && SET_COOKIE.equalsIgnoreCase(key.toLowerCase())) {
				cookie = http.getHeaderField(i).split(";")[0];
				split = cookie.split("=");
				if(split.length >= 2)
					cookies.put(split[0], split[1]);
			}
		}

	}

	/**
	 * Write the cookies to a http connection. It will set the Cookie field
	 * to all currently set cookies in the map.
	 *
	 * @param http A http connection.
	 */
	public void setCookies(HttpURLConnection http) {

		// Only save cookies if FLAGS_ENABLE_COOKIES has been set.
		if((flags & XMLRPCClient.FLAGS_ENABLE_COOKIES) == 0)
			return;

		String concat = "";
		for(Map.Entry<String,String> cookie : cookies.entrySet()) {
			concat += cookie.getKey() + "=" + cookie.getValue() + "; ";
		}
		http.setRequestProperty(COOKIE, concat);

	}

}