#!/usr/bin/perl

use strict;
use warnings;

use Carp qw(confess);
use File::Basename;
use XML::LibXSLT;
use XML::LibXML;

use Ernad::Common;
use Ernad::Erimp;
use Morton::Amf;
use Morton::Layout;
use IO::Compress::Gzip qw(gzip $GzipError);
use Krichel::File;

my $home_dir=$ENV{'HOME'};
my $fields_dir="$home_dir/fields";
my $lib_dir="$home_dir/oai/lib/amf";

my $issue_fufi=$ARGV[0];
if(not $issue_fufi) {
  print("I need an issue file argument\n");
  exit;
}

if(not -f $issue_fufi) {
  print("I do not see $issue_fufi\n");
  exit;
}

our $e=Ernad::Erimp->new({'impna'=>'nep'});
my $xpc=$e->{'xpc'} // confess 'I need an xpc here.';


my $backup_dir='/home/ernad/opt/issues';
my $bana=basename($issue_fufi);
my $backup_fufi="$backup_dir/$bana";
if(! -f $backup_fufi) {
  system("/usr/bin/cp -a $issue_fufi $backup_fufi");
}
else {
  print("I copy back $backup_fufi to $issue_fufi\n");
  system("/usr/bin/cp -a $backup_fufi $issue_fufi");
}

my $issue_doc=&Krichel::File::load_xml($issue_fufi);
my $text_xp='/amf:amf/amf:collection/amf:haspart/amf:text';
for my $text_ele (@{$xpc->find($text_xp,$issue_doc)}) {
  my $handle=$text_ele->getAttribute('ref');
  for my $node (@{$xpc->find('./*',$text_ele)}) {
    my $name=$node->nodeName();
    if($name eq 'sausage') {
      next;
    }
    if($name eq 'file') {
      next;
    }
    my $next_node=$node->nextSibling() // next;
    if($next_node->data() eq "\n") {
      $next_node->parentNode->removeChild($next_node);
    }
    $node->parentNode->removeChild($node);
  }
  my $amf_text_doc=&Morton::Amf::read_amf_for_handle($handle);
  my $data_xp='/amf:amf/amf:text/*';
  for my $attrib_node (reverse(@{$xpc->find($data_xp, $amf_text_doc)})) {
    my $name=$attrib_node->nodeName();
    if($name eq 'file') {
      next;
    }
    my $first=$text_ele->firstChild;
    my $add_ele=$attrib_node->cloneNode(1);
    $text_ele->insertAfter($add_ele, $first);
    my $nl_node=XML::LibXML::Text->new("\n");
    $text_ele->insertAfter($nl_node, $add_ele);
    my $next_node=$attrib_node->nextSibling() // next;
  }
}

if(substr($issue_fufi,-3) eq '.gz') {
  my $non_gz_issue_fufi=substr($issue_fufi,0,length($issue_fufi)-3);
  $issue_doc->toFile($non_gz_issue_fufi);
  system("/usr/bin/gzip -f $non_gz_issue_fufi");
}
else {
  $issue_doc->toFile($issue_fufi);
}
