package com.mycompany;

import java.util.Map;

import org.apache.wicket.util.string.AppendingStringBuffer;
import org.apache.wicket.util.value.ValueMap;

public abstract class IndexedIdEncryptingUrlCodingStrategy extends LowercaseOnlyIndexedUrlEncodingStrategy {

	private final int[] _encryptedParams;

	public IndexedIdEncryptingUrlCodingStrategy(final String mountPath, final String serverRoot, final Class<?> bookmarkablePageClass, final int... encryptedParmas) {
		super(mountPath, serverRoot, bookmarkablePageClass);
		_encryptedParams = encryptedParmas;
	}

	public IndexedIdEncryptingUrlCodingStrategy(final String mountPath, final String serverRoot, final Class<?> bookmarkablePageClass, final String pageMapName, final int... encryptedParmas) {
		super(mountPath, serverRoot, bookmarkablePageClass);
		_encryptedParams = encryptedParmas;
	}

	@SuppressWarnings("unchecked")
	@Override
	protected void appendParameters(final AppendingStringBuffer url, final Map params) {
		for (final int index : _encryptedParams) {
			final String indexStr = Integer.toString(index);
			final Object val = params.get(indexStr);
			if (val != null && val instanceof Integer) {
				params.put(indexStr, encodeId((Integer) val));
			}
		}
		super.appendParameters(url, params);
	}

	@Override
	protected ValueMap onDecodeParameters(final String urlFragment, final ValueMap urlParameters) {

		for (final int index : _encryptedParams) {
			final String indexStr = Integer.toString(index);
			final Object val = urlParameters.get(indexStr);
			if (val != null && val instanceof String) {
				urlParameters.put(indexStr, decodeId((String) val));
			}
		}

		return urlParameters;
	}

	protected int[] getEncryptedParams() {
		return _encryptedParams;
	}

	protected abstract String encodeId(Integer val);

	protected abstract Integer decodeId(String val);

}

