#!/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 $base = shift;
  my $dir = shift;
  my %entries = @_;

  return %entries if (!-d "$base/$dir");

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

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

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

  $file =~ s/^(\.\/)*//;
  return %entries if ($file !~ /(\.(dtd|properties|rdf|xhtml)|chrome\.manifest)$/);

  open F, "<$base/$file";
  my @lines = <F>;
  close F;
  my $contents = join "", @lines;
  my %newentries = ("index" => []);
  if ($file =~ /\.dtd$/) {
    %newentries = PO4Moz::MozDTD::parse($file, $contents);
  }
  elsif ($file =~ /\.properties$/) {
    %newentries = PO4Moz::MozProp::parse($file, $contents);
  }
  elsif ($file =~ /contents\.rdf$/) {
    %newentries = PO4Moz::ContentsRDF::parse($file, $contents);
  }
  elsif ($file =~ /chrome\.manifest$/) {
    %newentries = PO4Moz::Manifest::parse($file, $contents);
  }
  elsif ($file =~ /install\.rdf$/) {
    %newentries = PO4Moz::InstallRDF::parse($file, $contents);
  }
  elsif ($file =~ /\.xhtml$/) {
    %newentries = PO4Moz::HelpFile::parse($file, $contents);
  }
  elsif ($file =~ /\/help\/.*?\.rdf$/) {
    %newentries = PO4Moz::HelpRDF::parse($file, $contents);
  }
  push @{$entries{"index"}}, @{$newentries{"index"}};
  foreach my $k (keys %newentries) {
    if ($k ne "index") {
      $entries{$k} = $newentries{$k};
    }
  }
  
  return %entries;
}

my $startdir = $ARGV[0];
if (!$startdir) {
  print STDERR "Usage: $0 directory > outfile.pot\n";
  exit 1;
}

my %entries = ();
%entries = process_directory($startdir, ".", %entries);

print PO4Moz::POfile::generate("", %entries);
