/**
 * Written by Bruno Lowagie.
 * This code uses LGPL'ed and GPL'ed software,
 * and is therefore also available under the GPL.
 */

package test;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import be.godot.sc.engine.BelpicCard;
import be.godot.sc.exceptions.InvalidResponse;
import be.godot.sc.exceptions.NoReadersAvailable;
import be.godot.sc.exceptions.NoSuchFeature;
import be.godot.sc.exceptions.SmartCardReaderException;
import be.godot.sc.exceptions.UnknownCardException;
import be.godot.sc.exceptions.UnsupportedEncodingException;

import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;

public class EIDFormAutoFill2 {
	public static void main(String[] args) {
		try {
			PdfReader reader = new PdfReader("EIDForm.pdf");
			FileOutputStream fout = new FileOutputStream("EIDFormAutoFilled2.pdf");
			PdfStamper stamper = new PdfStamper(reader, fout);
			AcroFields form = stamper.getAcroFields();
			form.setExtraMargin(0, 1);
			
			BelpicCard scd = new BelpicCard("");
			CitizenIdentityData identity = new CitizenIdentityData(scd.readCitizenIdentityDataBytes());
			form.setField(EIDForm.BIRTH_DATE, identity.getBirthDate());
			form.setField(EIDForm.BIRTH_LOCATION, identity.getBirthLocation());
			form.setField(EIDForm.CARD_NUMBER, identity.getCardNumber());
			form.setField(EIDForm.CARD_VALIDITY_BEGIN, identity.getCardValidityBegin());
			form.setField(EIDForm.CARD_VALIDITY_END, identity.getCardValidityEnd());
			form.setField(EIDForm.CHIP_NUMBER, identity.getChipNumber());
			form.setField(EIDForm.DOCUMENT_TYPE, identity.getDocumentType());
			form.setField(EIDForm.NAME, identity.getName());
			form.setField(EIDForm.NATIONAL_NUMBER, identity.getNationalNumber());
			form.setField(EIDForm.NATIONALITY, identity.getNationality());
			form.setField(EIDForm.SEX, identity.getSex());
			form.setField(EIDForm.TWO_FIRST_FIRST_NAMES, identity.getTwoFirstFirstNames() + " " + identity.getFirstLetterThirdFirstName());
			CitizenAddressData address = new CitizenAddressData(scd.readCitizenAddressBytes());
			form.setField(EIDForm.ADDRESS, address.getAddress());
			form.setField(EIDForm.MUNICIPALITY, address.getMunicipality());
			form.setField(EIDForm.ZIP, address.getZip());
			
			form.setField(EIDForm.CERT_AUTHENTICATION, new String(scd.getAuthCertificateBytes()));
			form.setField(EIDForm.CERT_NON_REPUDIATION, new String(scd.getNonRepCertificateBytes()));
			form.setField(EIDForm.CERT_CITIZEN_CA, new String(scd.readCACertificateBytes()));
			form.setField(EIDForm.CERT_ROOT_CA, new String(scd.readRootCACertificateBytes()));
			form.setField(EIDForm.CERT_RNN_CA, new String(scd.readRRNCertificateBytes()));
			
			stamper.setFormFlattening(true);
  			stamper.close();
		} catch(DocumentException de) {
			de.printStackTrace();
		} catch(IOException ioe) {
			ioe.printStackTrace();
		} catch (UnknownCardException uce) {
			uce.printStackTrace();
		} catch (SmartCardReaderException scre) {
			scre.printStackTrace();
		} catch (NoReadersAvailable nra) {
			nra.printStackTrace();
		} catch (NoSuchFeature nsf) {
			nsf.printStackTrace();
		} catch (InvalidResponse ir) {
			ir.printStackTrace();
		} catch (UnsupportedEncodingException uee) {
			uee.printStackTrace();
		}
	}

 public static byte[] streamToByteArray(InputStream stream) throws Throwable
 {
  if (stream == null)
  {
   return null;
  }
  else
  {
   ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
   byte buffer[] = new byte[1024];
   int c = 0;
   while ( (c = stream.read(buffer)) > 0)
   {
    byteArray.write(buffer, 0, c);
   }
   byteArray.flush();
   return byteArray.toByteArray();
  }
 }
}
