#!/usr/bin/perl -w

use strict;

use open ':utf8', ':std';

use PO4Moz::MozDTD;
use PO4Moz::MozProp;
use PO4Moz::ContentsRDF;
use PO4Moz::Manifest;
use PO4Moz::InstallRDF;
use PO4Moz::HelpFile;
use PO4Moz::HelpRDF;
use PO4Moz::POfile;

sub process_directory {
  my $english = shift;
  my $trans = shift;
  my $dir = shift;
  my %entries = @_;

  if (!-d "$english/$dir") {
    print STDERR "$english/$dir is not a directory.\n";
    exit 1;
  }
  
  if (-x "$trans/$dir") {
    print STDERR "$trans/$dir already exists.\n";
    exit 1;
  }

  opendir DIR, "$english/$dir";
  my @direntries = sort(readdir DIR);
  closedir DIR;

  my $tdircanon = "$trans/$dir";
  $tdircanon =~ s/(\/\.)$//; # Remove trailing /. from translation dir
  
  if (!mkdir "$tdircanon") {
    print STDERR "Could not create directory $tdircanon\n";
    exit 1;
  }

  foreach my $file (grep { -f "$english/$dir/$_" } @direntries) {
    process_file($english, $trans, "$dir/$file", %entries);
  }
  
  foreach my $newdir (grep { $_ ne "." && $_ ne ".." && -d "$english/$dir/$_" } @direntries) {
    process_directory($english, $trans, "$dir/$newdir", %entries);
  }
  
  return;
}

sub process_file {
  my $english = shift;
  my $trans = shift;
  my $file = shift;
  my %entries = @_;

  $file =~ s/^(\.\/)*//;

  open F, "<$english/$file";
  my @lines = <F>;
  close F;
  my $englishcontents = join "", @lines;
  my $transcontents = "";

  if ($file =~ /\.dtd$/) {
    $transcontents = PO4Moz::MozDTD::translate($file, $englishcontents, %entries);
  }
  elsif ($file =~ /\.properties$/) {
    $transcontents = PO4Moz::MozProp::translate($file, $englishcontents, %entries);
  }
  elsif ($file =~ /contents\.rdf$/) {
    $transcontents = PO4Moz::ContentsRDF::translate($file, $englishcontents, %entries);
  }
  elsif ($file =~ /chrome\.manifest$/) {
    $transcontents = PO4Moz::Manifest::translate($file, $englishcontents, %entries);
  }
  elsif ($file =~ /install\.rdf$/) {
    $transcontents = PO4Moz::InstallRDF::translate($file, $englishcontents, %entries);
  }
  elsif ($file =~ /\.xhtml$/) {
    $transcontents = PO4Moz::HelpFile::translate($file, $englishcontents, %entries);
  }
  elsif ($file =~ /\/help\/.*?\.rdf$/) {
    $transcontents = PO4Moz::HelpRDF::translate($file, $englishcontents, %entries);
  }
  else {
    $transcontents = $englishcontents;
  }

  open F, ">$trans/$file";
  print F $transcontents;
  close F;
  
  return;
}

my $englishdir = $ARGV[0];
my $pofile = $ARGV[1];
my $transdir = $ARGV[2];
if (!$englishdir || !$pofile || !$transdir) {
  print STDERR "Usage: $0 directoryenglish pofile.po directorytranslation\n";
  exit 1;
}

if (!-d $englishdir) {
  print STDERR "$englishdir is not a directory or does not exist.\n";
  exit 1;
}

if (-x $transdir) {
  print STDERR "$transdir already exists.\n";
  exit 1;
}

if (!-f $pofile) {
  print STDERR "$pofile does not exist or is not a regular file.\n";
  exit 1;
}

open F, "<$pofile";
my @lines = <F>;
close F;
my %entries = PO4Moz::POfile::parse("$pofile", join("", @lines));

process_directory($englishdir, $transdir, ".", %entries);
