/*
 * Commons eID Project.
 * Copyright (C) 2008-2013 FedICT.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License version
 * 3.0 as published by the Free Software Foundation.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, see 
 * http://www.gnu.org/licenses/.
 */

package be.fedict.commons.eid.consumer;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * Enumeration for eID Document Type.
 * 
 * @author Frank Cornelis
 * 
 */
public enum DocumentType implements Serializable {

	BELGIAN_CITIZEN("1"),

	KIDS_CARD("6"),

	BOOTSTRAP_CARD("7"),

	HABILITATION_CARD("8"),

	/**
	 * Bewijs van inschrijving in het vreemdelingenregister ??? Tijdelijk
	 * verblijf
	 */
	FOREIGNER_A("11"),

	/**
	 * Bewijs van inschrijving in het vreemdelingenregister
	 */
	FOREIGNER_B("12"),

	/**
	 * Identiteitskaart voor vreemdeling
	 */
	FOREIGNER_C("13"),

	/**
	 * EG-Langdurig ingezetene
	 */
	FOREIGNER_D("14"),

	/**
	 * (Verblijfs)kaart van een onderdaan van een lidstaat der EEG Verklaring
	 * van inschrijving
	 */
	FOREIGNER_E("15"),

	/**
	 * Document ter staving van duurzaam verblijf van een EU onderdaan
	 */
	FOREIGNER_E_PLUS("16"),

	/**
	 * Kaart voor niet-EU familieleden van een EU-onderdaan of van een Belg
	 * Verblijfskaart van een familielid van een burger van de Unie
	 */
	FOREIGNER_F("17"),

	/**
	 * Duurzame verblijfskaart van een familielid van een burger van de Unie
	 */
	FOREIGNER_F_PLUS("18"),

	/**
	 * H. Europese blauwe kaart. Toegang en verblijf voor onderdanen van derde
	 * landen.
	 */
	EUROPEAN_BLUE_CARD_H("19");

	private final int key;

	private DocumentType(final String value) {
		this.key = toKey(value);
	}

	private int toKey(final String value) {
		final char c1 = value.charAt(0);
		int key = c1 - '0';
		if (2 == value.length()) {
			key *= 10;
			final char c2 = value.charAt(1);
			key += c2 - '0';
		}
		return key;
	}

	private static int toKey(final byte[] value) {
		int key = value[0] - '0';
		if (2 == value.length) {
			key *= 10;
			key += value[1] - '0';
		}
		return key;
	}

	private static Map<Integer, DocumentType> documentTypes;

	static {
		final Map<Integer, DocumentType> documentTypes = new HashMap<Integer, DocumentType>();
		for (DocumentType documentType : DocumentType.values()) {
			final int encodedValue = documentType.key;
			if (documentTypes.containsKey(encodedValue)) {
				throw new RuntimeException("duplicate document type enum: "
						+ encodedValue);
			}
			documentTypes.put(encodedValue, documentType);
		}
		DocumentType.documentTypes = documentTypes;
	}

	public int getKey() {
		return this.key;
	}

	public static DocumentType toDocumentType(final byte[] value) {
		final int key = DocumentType.toKey(value);
		final DocumentType documentType = DocumentType.documentTypes.get(key);
		/*
		 * If the key is unknown, we simply return null.
		 */
		return documentType;
	}

	public static String toString(final byte[] documentTypeValue) {
		return Integer.toString(DocumentType.toKey(documentTypeValue));
	}
}

/**
	 * Bewijs van inschrijving in het vreemdelingenregister ??? Tijdelijk
	 * verblijf
	 */
/*
 * Commons eID Project.
 * Copyright (C) 2008-2013 FedICT.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License version
 * 3.0 as published by the Free Software Foundation.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, see 
 * http://www.gnu.org/licenses/.
 */

package be.fedict.commons.eid.consumer;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * Enumeration for eID Document Type.
 * 
 * @author Frank Cornelis
 * 
 */
public enum DocumentType implements Serializable {

	BELGIAN_CITIZEN("1"),

	KIDS_CARD("6"),

	BOOTSTRAP_CARD("7"),

	HABILITATION_CARD("8"),

	/**
	 * Bewijs van inschrijving<SUF>*/
	FOREIGNER_A("11"),

	/**
	 * Bewijs van inschrijving in het vreemdelingenregister
	 */
	FOREIGNER_B("12"),

	/**
	 * Identiteitskaart voor vreemdeling
	 */
	FOREIGNER_C("13"),

	/**
	 * EG-Langdurig ingezetene
	 */
	FOREIGNER_D("14"),

	/**
	 * (Verblijfs)kaart van een onderdaan van een lidstaat der EEG Verklaring
	 * van inschrijving
	 */
	FOREIGNER_E("15"),

	/**
	 * Document ter staving van duurzaam verblijf van een EU onderdaan
	 */
	FOREIGNER_E_PLUS("16"),

	/**
	 * Kaart voor niet-EU familieleden van een EU-onderdaan of van een Belg
	 * Verblijfskaart van een familielid van een burger van de Unie
	 */
	FOREIGNER_F("17"),

	/**
	 * Duurzame verblijfskaart van een familielid van een burger van de Unie
	 */
	FOREIGNER_F_PLUS("18"),

	/**
	 * H. Europese blauwe kaart. Toegang en verblijf voor onderdanen van derde
	 * landen.
	 */
	EUROPEAN_BLUE_CARD_H("19");

	private final int key;

	private DocumentType(final String value) {
		this.key = toKey(value);
	}

	private int toKey(final String value) {
		final char c1 = value.charAt(0);
		int key = c1 - '0';
		if (2 == value.length()) {
			key *= 10;
			final char c2 = value.charAt(1);
			key += c2 - '0';
		}
		return key;
	}

	private static int toKey(final byte[] value) {
		int key = value[0] - '0';
		if (2 == value.length) {
			key *= 10;
			key += value[1] - '0';
		}
		return key;
	}

	private static Map<Integer, DocumentType> documentTypes;

	static {
		final Map<Integer, DocumentType> documentTypes = new HashMap<Integer, DocumentType>();
		for (DocumentType documentType : DocumentType.values()) {
			final int encodedValue = documentType.key;
			if (documentTypes.containsKey(encodedValue)) {
				throw new RuntimeException("duplicate document type enum: "
						+ encodedValue);
			}
			documentTypes.put(encodedValue, documentType);
		}
		DocumentType.documentTypes = documentTypes;
	}

	public int getKey() {
		return this.key;
	}

	public static DocumentType toDocumentType(final byte[] value) {
		final int key = DocumentType.toKey(value);
		final DocumentType documentType = DocumentType.documentTypes.get(key);
		/*
		 * If the key is unknown, we simply return null.
		 */
		return documentType;
	}

	public static String toString(final byte[] documentTypeValue) {
		return Integer.toString(DocumentType.toKey(documentTypeValue));
	}
}
