#!/usr/bin/perl
# implements xgettext for Log::Report only, using Log::Report::Extract::PPI
# Options like GNU's xgettext

use warnings;
use strict;

use Log::Report 'log-report', syntax => 'SHORT';
use Getopt::Long qw/:config no_ignore_case bundling/;

use Log::Report::Extract::PerlPPI;

my $from     = 'MANIFEST';
my $output;
my $lang     = 'perl';
my $char_in  = 'iso-8859-1';
my $char_out = 'utf-8';
my $merge    = 0;
my $version  = 0;
my $help     = 0;
my $mode;

GetOptions
   'files-from|f=s'    => \$from
 , 'output-dir|p=s'    => \$output
 , 'language|L=s'      => \$lang
 , 'from-code=s'       => \$char_in
 , 'to-code=s'         => \$char_out  # missing in xgettext?
 , 'join-existing|j=s' => \$merge
 , 'version|V'         => \$version
 , 'help|h'            => \$help
 , 'verbose=i'         => \$mode
 , 'v+'                => \$mode
 , 'mode=s'            => \$mode
or exit(1);

if($version)
{   print "Log::Report $Log::Report::VERSION\n";
    exit 0;
}

if($help)
{   print <<__HELP;
Log::Report's version of xgettext, has a subset of options
of GNU's version, and no own manual-page yet.
__HELP
}

dispatcher FILE => stderr => to => \*STDERR, mode => $mode;

$lang eq 'perl'
    or mistake __x"programming language {lang} not supported", lang => $lang;

defined $output
    or mistake __"explicit output directory (-p) required";

-d $output or mkdir $output
    or fault __x"cannot create output directory {dir}", dir => $output;

#
### process the pm files
#

my $ppi = Log::Report::Extract::PerlPPI->new
 ( lexicon => $output
 , charset => $char_out
 );

open FILENAMES, '<', $from
    or fault "cannot read filename list from {filename}", filename => $from;

while( my $filename = <FILENAMES> )
{   chomp $filename;
    next unless $filename =~ m/\.pm$/;

    $ppi->process($filename, charset => $char_in);
}

$ppi->showStats;

$ppi->write;
