package demo;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import at.gv.egiz.pdfas.PdfAsFactory;
import at.gv.egiz.pdfas.api.PdfAs;
import at.gv.egiz.pdfas.api.analyze.NonTextObjectInfo;
import at.gv.egiz.pdfas.api.commons.Constants;
import at.gv.egiz.pdfas.api.exceptions.PdfAsException;
import at.gv.egiz.pdfas.api.io.DataSource;
import at.gv.egiz.pdfas.api.sign.SignParameters;
import at.gv.egiz.pdfas.api.sign.SignResult;
import at.gv.egiz.pdfas.api.sign.pos.SignaturePositioning;
import at.gv.egiz.pdfas.api.timestamp.DummyTimeStamper;
import at.gv.egiz.pdfas.io.FileBasedDataSink;
import at.gv.egiz.pdfas.io.FileBasedDataSource;

public class SignatureCreationDemo {

   /**
    * Disable instantiation.
    */
   private SignatureCreationDemo() {
   }

   /**
    * Starts a demo that signs a document.
    * 
    * @param args
    *           The parameter(s).
    */
   public static void main(String[] args) {

      if (args == null || args.length == 0) {
         System.err.println("Please provide path of file to be signed.");
         System.exit(1);
      }
      
      File configdir = new File("./work");
      File unsignedFile = new File(args[0]);
      File signedFile = new File(args[0] + "_signed.pdf");

      try {
         
         // instantiate api
         PdfAs pdfasAPI = PdfAsFactory.createPdfAs(configdir);

         // set source
         DataSource dataSource = new FileBasedDataSource(unsignedFile, "application/pdf");

         // set output
         FileBasedDataSink dataSink = new FileBasedDataSink(signedFile);

         // configure signature
         SignParameters signParameters = new SignParameters();
         signParameters.setDocument(dataSource);
         signParameters.setOutput(dataSink);
         signParameters.setSignatureDevice(Constants.SIGNATURE_DEVICE_MOA);
         signParameters.setSignaturePositioning(new SignaturePositioning("x:auto;y:auto;w:auto;p:auto;f:80"));
         // standard signature
         signParameters.setSignatureType(Constants.SIGNATURE_TYPE_TEXTUAL);
         signParameters.setSignatureProfileId("SIGNATURBLOCK_DE");
         
         // --- enable in case of BAIK SIGNATURE ---
         /*
            signParameters.setSignatureType(Constants.SIGNATURE_TYPE_BINARY);
            // signParameters.setSignatureProfileId("BAIK_URKUNDE_SIGNATUR");
            signParameters.setSignatureProfileId("BAIK_ARCHIV_SIGNATUR");
            // use BAIK TimeStamp
            signParameters.setTimeStamperImpl(new DummyTimeStamper());
         */

         // dynamic adjustment of signature profile values
         // warning: inconsiderate modifications might lead to signatures that can't be validated
         //          based on default configuration
         // note: any modifications are bound to the SignParameters object instance.
         //       It is not possible to permanently change profile configuration.
         signParameters.setProfileOverrideValue("SIG_NAME", "Max Mustermann");
         signParameters.setProfileOverrideValue("SIG_META", "This is a modified note.");
         
         // sign
         System.out.println("Signing...");
         SignResult signResult = pdfasAPI.sign(signParameters);
         System.out.println("Successfully signed.");
         
         // check if non textual elements have been detected
         if (signResult.hasNonTextualObjects()) {
            System.out.println("\nWARNING: " + signResult.getNonTextualObjects().size() + " non textual object(s) detected.");
            Iterator noit = signResult.getNonTextualObjects().iterator();
            while (noit.hasNext()) {
               NonTextObjectInfo info = (NonTextObjectInfo) noit.next();
               System.out.println("  -> " + info.toString());
            }
            System.out.println();
         }
         
      } catch (PdfAsException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }

   }
   
}