/**
 * 
 */
package at.gv.egiz.pdfas.impl.input;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import at.gv.egiz.pdfas.exceptions.ErrorCode;
import at.gv.egiz.pdfas.framework.input.PdfDataSource;
import at.gv.egiz.pdfas.framework.input.PdfDataSourceHolder;
import at.gv.egiz.pdfas.framework.input.correction.Corrector;
import at.gv.egiz.pdfas.framework.input.correction.CorrectorFactory;
import at.gv.egiz.pdfas.impl.input.helper.DataSourceHelper;
import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
import at.knowcenter.wag.exactparser.ParseDocument;

/**
 * Parses the given PDF document into a list of Incremental Update blocks.
 * @author wprinz
 */
public class IncrementalUpdateParser
{
  /**
   * The log.
   */
  private static final Log log = LogFactory.getLog(IncrementalUpdateParser.class);
  
  public static List parsePdfIntoIUBlocks (PdfDataSourceHolder pdfDataSource) throws PDFDocumentException
  {
    log.trace("parsePdfIntoIUBlocks:");
    
    List blocks = null;
    try
    {
      byte [] pdf = DataSourceHelper.convertDataSourceToByteArray(pdfDataSource.getDataSource());
      blocks = ParseDocument.parseDocument(pdf);
    }
    catch (Exception e)  {
       try {
          log.debug("Error while parsing Document.", e);
          boolean tryToCorrect = SettingsReader.getInstance().getSetting("correct_document_on_verify_if_necessary", "false").equals("true");
          if (tryToCorrect) {
             log.info("Correcting document...");
             Corrector cor = CorrectorFactory.createCorrector();
             PdfDataSource correctedDS = cor.correctDocument(pdfDataSource.getDataSource());
             log.info("Correction finished.");
             byte [] pdf = DataSourceHelper.convertDataSourceToByteArray(correctedDS);
             blocks = ParseDocument.parseDocument(pdf);
             pdfDataSource.setDataSource(correctedDS);
          } else {
             makeError(e);
          }

      } catch (Exception e1) {
         makeError(e);
      }
    }

    log.trace("parsePdfIntoIUBlocks finished.");
    return blocks;
  }

   private static void makeError(Exception e) throws PDFDocumentException {
      log.error("Error while parsing Document into IU blocks.", e);
      throw new PDFDocumentException(ErrorCode.DOCUMENT_CANNOT_BE_READ, e);
   }
  
}