#!perl

use strict;
use warnings;
use diagnostics;

# dieses script funktioniert nur mit use diagnostics
# das ist voellig unlogisch und raetselhaft
# andernfalls kommt es zu folgendem Problem:
# beim Schleifendurchlauf in 88ff kommt es zu einer 
# Endlosschleife, wenn im selben Schleifendurchlauf zweimal die
# Funktion lookup_page_id aufgerufen wird
# wird sie nur einmal aufgerufen funktioniert alles einwandfrei
# das passiert nur, falls das script als cgi script laeuft, nicht
# wenn man es von der kommandozeile startet.
# bei gelegenheit mal pruefen ob das ein win7 oder activestate problem ist
# oder ob das auf einer unix maschine auch passiert



#use CGI::Carp qw(fatalsToBrowser);

use CGI;
use File::Copy;
use File::Util;
use Template;
use XML::Simple;
use Data::Dumper;

use TCE::Config;
use Pica::Records;
use Pica::Converter;

# global variables
our @messages;
our $go = 1;
our @shortened_structmap = ();

      
our $msg_ok = $TCE::Config::MSG_SYMBOLS{'ok'};
our $msg_fail = $TCE::Config::MSG_SYMBOLS{'fail'};
our $msg_warn = $TCE::Config::MSG_SYMBOLS{'warn'};



# create the File::Util object
my $fu = File::Util->new();

# create the CGI object
my $cgi = CGI->new();


#receive cgi parameter
my $item_id    = $cgi->param('itemid') || error($msg_fail.' Es wurde kein Vorgangstitel angegeben. Daher konnte kein neuer Vorgang angelegt werden.');


if ($go)
{
      # load the shortened structmap
      open FILE, '<'.$TCE::Config::ITEMS.$item_id.'/'.$TCE::Config::DATA_STORAGE{'pages'};
      my @lines = <FILE>;
      close FILE;
      my $object = join('',@lines);
      my $VAR1;
      eval ($object);
      @shortened_structmap = @{$VAR1};
      

      
      #process pica downloadfile
      my $recs = Pica::Records->new($TCE::Config::ITEMS.$item_id.'/download.dwl');
      my $picarecord = $recs->next_record;
  
      # store volume metadata to disc
      open FILE,'>'.$TCE::Config::ITEMS.$item_id.'/'.$TCE::Config::DATA_STORAGE{'volume'};
      print FILE $picarecord->print_record({'xml' => 1});
      print FILE "\n";
      print FILE $picarecord->hostitem->print_record({'xml' => 1});
      close FILE;    
      
      message("$msg_ok Metadaten für den Band zwischengespeichert");
      
      #create structArray for editor and store as hash dump
      my $structArray = [];
      my $converter = Pica::Converter->new();
      
 
      foreach my $record (@{$picarecord->children})
      {
        my $structElem = {};
           $structElem->{'metadata'} = $converter->to_pica3($record->print_record);
           
           # encode utf-8
           utf8::encode($structElem->{'metadata'});
 
           my $startpage = $record->start_page;
           my $endpage = $record->end_page;
           $structElem->{'startpage'} = lookup_page_id($startpage);
           $structElem->{'endpage'} = lookup_page_id($endpage);
           $structElem->{'hierarchyLevel'} = 0;
           $structElem->{'id'} = $TCE::Config::PPN_PREFIX.$record->id;
      
 
          
          
           push @{$structArray}, $structElem;
           message("$msg_ok Strukturelement ".$structElem->{'id'}." in den Strukturbaum eingefügt.");
      }
      

      # sort
      my @sorted_structArray = sort {$a->{'startpage'} <=> $b->{'startpage'}} @{$structArray};
      
      # store to disc
      open FILE,'>'.$TCE::Config::ITEMS.$item_id.'/'.$TCE::Config::DATA_STORAGE{'struct'};
      print FILE Dumper \@sorted_structArray; #$structArray;
      close FILE;    
      
      message("$msg_ok Strukturbaum zwischengespeichert.");
    

}

#output success/error messages to browser
my $template = Template->new({'INCLUDE_PATH' => $TCE::Config::TEMPLATES_DIR});
print $cgi->header( -type=>"text/html" );
$template->process('tce_createitem_message.tmpl',{'messages' => \@messages, 'success' => $go, 'itemid' => $item_id }) || die $template->error();	

exit(1);

sub error
{
	my $text = shift;
	push @messages, $text;
	$go = 0;
	return undef; 

}

sub message
{
	my $text = shift;
	push @messages, $text;
	return 1;
}

sub lookup_page_id
{
	my $page_no = shift || undef;
	my $page_id = undef;
	if ($page_no)
	{
		my @pages = grep {($page_no eq $_->{'label'}) || ('['.$page_no.']' eq $_->{'label'})} @shortened_structmap;
		if ($#pages == 0)
		{
			$page_id = $pages[0]->{'order'};
		}
		else
		{
			message("$msg_warn Seite $page_no wurde nicht oder mehr als einmal in der Paginierungssequenz gefunden.");
		}
	}
	return $page_id;
}

