/**
 * Written by Bruno Lowagie.
 * This code uses LGPL'ed and GPL'ed software,
 * and is therefore also available under the GPL.
 */

package test;

import be.godot.sc.exceptions.UnsupportedEncodingException;
import be.godot.util.TextUtils;

public class CitizenIdentityData {

	public final static int TAG_TWO_FIRST_FIRST_NAMES = 8;
	public final static int TAG_NOBLE_CONDITION = 14;
	public final static int TAG_SPECIAL_STATUS = 16;
	
	String cardNumber;
	String chipNumber;
	String cardValidityBegin;
	String cardValidityEnd;
	String cardDeliveryMunicipality;
	String nationalNumber;
	String name;
	String twoFirstFirstNames = "";
	String firstLetterThirdFirstName = "";
	String nationality;
	String birthLocation;
	String birthDate;
	String sex;
	String nobleCondition = "";
	String documentType;
	String specialStatus = "";
	
	/**
	 * This method is an adaptation of be.godot.sc.apps.eid.be.ScReadCitizenIdentityData
	 * The original code was published under the GNU Public License.
	 */
	public CitizenIdentityData(byte[] data) throws UnsupportedEncodingException {
		int pos = 0;
		
		int tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		pos += TextUtils.tagLen;
		int dataLen = TextUtils.getDataLen(data, pos);
		int lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
		cardNumber = TextUtils.getString(data, pos, dataLen);
		pos += dataLen;

		tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		pos += TextUtils.tagLen;
		dataLen = TextUtils.getDataLen(data, pos);
		lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
		chipNumber = TextUtils.hexDump(data, pos, dataLen);
		pos += dataLen;

		tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		pos += TextUtils.tagLen;
		dataLen = TextUtils.getDataLen(data, pos);
		lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
		cardValidityBegin = TextUtils.getString(data, pos, dataLen);
		pos += dataLen;

		tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		pos += TextUtils.tagLen;
		dataLen = TextUtils.getDataLen(data, pos);
		lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
		cardValidityEnd = TextUtils.getString(data, pos, dataLen);
		pos += dataLen;

		tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		pos += TextUtils.tagLen;
		dataLen = TextUtils.getDataLen(data, pos);
		lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
		cardDeliveryMunicipality = TextUtils.getString(data, pos, dataLen);
		pos += dataLen;

		tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		pos += TextUtils.tagLen;
		dataLen = TextUtils.getDataLen(data, pos);
		lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
		nationalNumber = TextUtils.getString(data, pos, dataLen);
		pos += dataLen;

		tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		pos += TextUtils.tagLen;
		dataLen = TextUtils.getDataLen(data, pos);
		lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
		name = TextUtils.getString(data, pos, dataLen);
		pos += dataLen;

		tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		if (tagIdentifier == TAG_TWO_FIRST_FIRST_NAMES) {
			pos += TextUtils.tagLen;
			dataLen = TextUtils.getDataLen(data, pos);
			lenLen = TextUtils.getLenLen(data, pos);
			pos += lenLen;
			twoFirstFirstNames = TextUtils.getString(data, pos, dataLen);
			pos += dataLen;
			tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		}
		pos += TextUtils.tagLen;
		dataLen = TextUtils.getDataLen(data, pos);
		lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
		firstLetterThirdFirstName = TextUtils.getString(data, pos, dataLen);
		pos += dataLen;

		tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		pos += TextUtils.tagLen;
		dataLen = TextUtils.getDataLen(data, pos);
		lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
		nationality = TextUtils.getString(data, pos, dataLen);
		pos += dataLen;

		tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		pos += TextUtils.tagLen;
		dataLen = TextUtils.getDataLen(data, pos);
		lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
		birthLocation = TextUtils.getString(data, pos, dataLen);
		pos += dataLen;

		tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		pos += TextUtils.tagLen;
		dataLen = TextUtils.getDataLen(data, pos);
		lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
		birthDate = TextUtils.getString(data, pos, dataLen);
		pos += dataLen;

		tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		pos += TextUtils.tagLen;
		dataLen = TextUtils.getDataLen(data, pos);
		lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
		sex = TextUtils.getString(data, pos, dataLen);
		pos += dataLen;

		tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		if (tagIdentifier == TAG_NOBLE_CONDITION) {
			pos += TextUtils.tagLen;
			dataLen = TextUtils.getDataLen(data, pos);
			lenLen = TextUtils.getLenLen(data, pos);
			pos += lenLen;
			nobleCondition = TextUtils.getString(data, pos, dataLen);
			pos += dataLen;
			tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		}
		pos += TextUtils.tagLen;
		dataLen = TextUtils.getDataLen(data, pos);
		lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
		documentType = TextUtils.getString(data, pos, dataLen);
		pos += dataLen;

		tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		if (tagIdentifier == TAG_SPECIAL_STATUS) {
			pos += TextUtils.tagLen;
			dataLen = TextUtils.getDataLen(data, pos);
			lenLen = TextUtils.getLenLen(data, pos);
			pos += lenLen;
			specialStatus = TextUtils.getString(data, pos, dataLen);
			pos += dataLen;
			tagIdentifier = TextUtils.getTagIdentifier(data, pos);
		}
		pos += TextUtils.tagLen;
		dataLen = TextUtils.getDataLen(data, pos);
		lenLen = TextUtils.getLenLen(data, pos);
		pos += lenLen;
	}

	public String getBirthDate() {
		return birthDate;
	}

	public String getBirthLocation() {
		return birthLocation;
	}

	public String getCardDeliveryMunicipality() {
		return cardDeliveryMunicipality;
	}

	public String getCardNumber() {
		return cardNumber;
	}

	public String getCardValidityBegin() {
		return cardValidityBegin;
	}

	public String getCardValidityEnd() {
		return cardValidityEnd;
	}

	public String getChipNumber() {
		return chipNumber;
	}

	public String getDocumentType() {
		return documentType;
	}

	public String getFirstLetterThirdFirstName() {
		return firstLetterThirdFirstName;
	}

	public String getName() {
		return name;
	}

	public String getNationality() {
		return nationality;
	}

	public String getNationalNumber() {
		return nationalNumber;
	}

	public String getNobleCondition() {
		return nobleCondition;
	}

	public String getSex() {
		return sex;
	}

	public String getSpecialStatus() {
		return specialStatus;
	}

	public String getTwoFirstFirstNames() {
		return twoFirstFirstNames;
	}
}
