#!/usr/bin/perl

use strict;
use warnings;

use File::Basename;
use File::Slurper;
use Data::Dumper;
use XML::LibXML;

use Krichel::Shoti;


my $in_file=$ARGV[0];
if(not defined($in_file)) {
  print "fatal: no in_file argument\n";
  exit;
}
if(not -f $in_file) {
  print "I don't see your file $in_file\n";
  exit;
}
if(not $in_file=~m|\.xml$|) {
  print "fatal: your in_file $in_file does not end in .xml\n";
  exit;
}

my $del_file=$ARGV[1];
if(not defined($del_file)) {
  print "fatal: no del_file argument\n";
  exit;
}
if(not -f $del_file) {
  print "fatal: no such file $del_file\n";
  exit;
}

## handles to delete
my $del;
my @lines=&File::Slurper::read_lines($del_file);
foreach my $line (@lines) {
  ## use first non-blank in the file
  my $handle=$line;
  $handle=~s|\s*(\S+).*|$1| or next;
  $del->{$handle}=1;
}

my $now=&Krichel::Shoti::now();
my $bana=basename($in_file);
my $dina=dirname($in_file);
my $out_bana=$bana;
if($bana=~m|_([0-9a-z]{6})\.|) {
  my $time=$1;
  $out_bana=~s|\Q$time\E|$now|;
}
elsif($bana=~m|^(\d{4}-\d{2}-\d{2})\.amf\.xml|) {
  my $date=$1;
  $out_bana=$date.'_'.$now.'.amf.xml';
}
elsif($bana=~m|^(\d{4}-\d{2}-\d{2})\.xml|) {
  my $date=$1;
  $out_bana=$date.'_'.$now.'.xml';
}
else {
  print "I don't like your in_file $in_file.\n";
  exit;
}
my $out_file=$dina.'/'.$out_bana;

my $fh;
open $fh,"< $in_file";
binmode $fh; # drop all PerlIO layers possibly created by a use open pragma
my $doc = XML::LibXML->load_xml(IO => $fh);
close $fh;

my $root_ele=$doc->documentElement;
my $seen;

my $count_gone=0;
foreach my $text_ele ($root_ele->getElementsByTagName('text')) {
  my $id=$text_ele->getAttribute('ref');
  # print "$id\n";
  if(not $del->{$id}) {
    next;
  }
  my $haspart_ele=$text_ele->parentNode;
  my $haspart_name=$haspart_ele->nodeName;
  if(not $haspart_name eq 'haspart') {
    print "I don't delete '$id' to delete, as it's parent is not a haspart.";
    next;
  }
  my $coll_ele=$haspart_ele->parentNode;
  my $coll_name=$coll_ele->nodeName;
  if($coll_name ne 'collection') {
    print "I don't delete '$id'. It's grandparent is a '$coll_name'.\n";
    next;
  }
  $coll_ele->removeChild($haspart_ele);
  $count_gone++;
}

if(not $count_gone) {
  print "I found no items to delete.\n";
  exit;
}

$doc->toFile($out_file);
print "I wrote $out_file with $count_gone fewer texts.\n";
