#!/usr/bin/perl -w

use POSIX;

if($#ARGV!=0) {
  print "Usage: perl submerge.pl <dir>\n";
  exit;
}
my $sourcedir=$ARGV[0];
my $filmname;
my $swalien="";
my $swstyle="";
my $swcount=0;
my $rotjalien="";
my $rotjstyle="";
my $rotjcount=0;
my $donecount=0;
my $aliencount=0;
my $currentalien=0;
my %alienlines=();

if($^O eq "MSWin32") {
  @filelist=glob("\"$sourcedir\\\*.xml\"");
} else {
  @filelist=glob("\"$sourcedir/\*.xml\"");
}
my $listsize=@filelist;
if($listsize==0) {
  print "Error: No XML files found in $sourcedir\n";
  exit;
}

FILELOOP: for $sourcefile (@filelist) {
  my @arr;
  my @arr2;
  if($^O eq "MSWin32") {
    @arr=split(/\\/,$sourcefile);
  } else {
    @arr=split(/\//,$sourcefile);
  }
  my $fname=$arr[-1];
  @arr=split(/-/,$fname);
  my $filmname=$arr[0];
  if (index($fname,"-alien-") != -1) {
    if($filmname eq "SW") {
      if(length($swalien)>0) {
        print "ERROR: Only one alien file is permitted per film.\n";
        exit;
      }
      $swalien=$sourcefile;
      @arr2=split(/\./,$arr[3]);
      $swstyle=$arr2[0];
      open(OLDXML, "<".$sourcefile);
      foreach my $line (<OLDXML>) {
        if (index($line, '<Events ') != -1) {
          if (index($line, "NumberofEvents=") != -1) {
            @arr2=split(/NumberofEvents="/,$line);
            $swcount=$arr2[1];
            @arr2=split(/"/,$swcount);
            $swcount=$arr2[0];
          }
        }
      }
      close(OLDXML);
    }
    if($filmname eq "ROTJ") {
      if(length($rotjalien)>0) {
        print "ERROR: Only one alien file is permitted per film.\n";
        exit;
      }
      $rotjalien=$sourcefile;
      @arr2=split(/\./,$arr[3]);
      $rotjstyle=$arr2[0];
      open(OLDXML, "<".$sourcefile);
      foreach my $line (<OLDXML>) {
        if (index($line, '<Events ') != -1) {
          if (index($line, "NumberofEvents=") != -1) {
            @arr2=split(/NumberofEvents="/,$line);
            $rotjcount=$arr2[1];
            @arr2=split(/"/,$rotjcount);
            $rotjcount=$arr2[0];
          }
        }
      }
      close(OLDXML);
    }
  }
}

FILELOOP: for $sourcefile (@filelist) {
  my @arr;
  my @arr2;
  if($^O eq "MSWin32") {
    @arr=split(/\\/,$sourcefile);
  } else {
    @arr=split(/\//,$sourcefile);
  }
  my $fname=$arr[-1];
  @arr=split(/-/,$fname);
  my $filmname=$arr[0];
  if(($sourcefile ne $swalien) && ($sourcefile ne $rotjalien)) {
    print "Processing ".$fname."...\n";
    $donecount=$donecount+1;
    my $token="-merged-".$swstyle;
    my $mergename=$fname;
    $mergename=~s/-native/$token/;
    $mergename=~s/-match-/-merged-match-/;
    if(($filmname eq "SW") || ($filmname eq "ROTJ")) {
      if($filmname eq "SW") {
        if(length($swalien)==0) {
          print "ERROR: No corresponding alien subtitle file found for ".$fname."\n";
          next;
        }
      }
      if($filmname eq "ROTJ") {
        if(length($rotjalien)==0) {
          print "ERROR: No corresponding alien subtitle file found for ".$fname."\n";
          next;
        }
      }
      open(OLDXML, "<".$sourcefile);
      if($filmname eq "ROTJ") {
        open(ALIENXML, "<".$rotjalien);
        $token="-merged-".$rotjstyle;
        $mergename=$fname;
        $mergename=~s/-native/$token/;
        $mergename=~s/-match-/-merged-match-/;
      } else {
        open(ALIENXML, "<".$swalien);
      }
      if($^O eq "MSWin32") {
        open(NEWXML, '>' . $sourcedir . '\\' . $mergename);
      } else {
        open(NEWXML, '>' . $sourcedir . '/' . $mergename);
      }
      foreach my $aline (<ALIENXML>) {
        if (index($aline, '<Event ') != -1) {
          if (index($aline, "InTC=") != -1) {
            $aliencount=$aliencount+1;
            @arr=split(/InTC="/,$aline);
            $alien_timecode=$arr[1];
            @arr=split(/"/,$alien_timecode);
            $alien_timecode=$arr[0];
            $alienlines{$aliencount}{0}=$alien_timecode;
            $alienlines{$aliencount}{1}=$aline;
	  }
        }
        if (index($aline, '<Graphic ') != -1) {
          $alienlines{$aliencount}{1}=$alienlines{$aliencount}{1}.$aline;
        }
        if (index($aline, '</Event>') != -1) {
          $alienlines{$aliencount}{1}=$alienlines{$aliencount}{1}.$aline;
        }
      }
      foreach my $line (<OLDXML>) {
        if (index($line, '<Event ') != -1) {
          if (index($line, "InTC=") != -1) {
            @arr=split(/InTC="/,$line);
            $timecode=$arr[1];
            @arr=split(/"/,$timecode);
            $timecode=$arr[0];
            for($i=$currentalien+1;$i<$aliencount+1;$i++) {
              if($timecode gt $alienlines{$i}{0}) {
                print NEWXML $alienlines{$i}{1};
                $currentalien=$currentalien+1;
              }
            }
	  }
          print NEWXML $line;
        } else {
          if (index($line, '<Events ') != -1) {
            if (index($line, "NumberofEvents=") != -1) {
              @arr2=split(/NumberofEvents="/,$line);
              my $count=$arr2[1];
              @arr2=split(/"/,$count);
              $count=$arr2[0];
              $token1='NumberofEvents="'.$count;
              if($filmname eq "SW") {
                $token2='NumberofEvents="'.($count+$swcount);
              } else {
                $token2='NumberofEvents="'.($count+$rotjcount);
              }
              $line=~s/$token1/$token2/;
            }
          }
          print NEWXML $line;
        }
      }
      close(NEWXML);
      close(OLDXML);
      close(ALIENXML);
      unlink($sourcefile);
    } else {
      if($^O eq "MSWin32") {
        rename($sourcefile,$sourcedir . '\\' . $mergename);
      } else {
        rename($sourcefile,$sourcedir . '/' . $mergename);
      }
    }
  }
}

if(length($swalien)>0) {
  unlink($swalien);
}
if(length($rotjalien)>0) {
  unlink($rotjalien);
}

if ($donecount>0) {
  print "Process complete. Subtitles in $sourcedir have been merged and renamed.\n";
} else {
  print "No native subtitle files found to merge.\n";
}
