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.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.setSignatureType(Constants.SIGNATURE_TYPE_BINARY);
         signParameters.setSignatureDevice(Constants.SIGNATURE_DEVICE_MOA);
         signParameters.setSignatureProfileId("SIGNATURBLOCK_DE");
         signParameters.setSignaturePositioning(null);

         // 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: Non textual objects 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();
      }

   }
   
}