#!/usr/bin/perl
#
# $Id$
#
use strict;
use lib qw(/usr/share/benno-tools-lib);
use Getopt::Std;
use File::Find;
use Benno;
use Benno::Config;
use Benno::Boxstate;
use Benno::Mailfile;

my $VERSION = '2.8.9';


my %opts;
getopts('Vhdsvc:C:e:i:m:r:R:',\%opts);

my $configfile  = $opts{c}  || '/etc/benno/benno.xml';
my $container   = $opts{C}  || 'BennoContainer';
my $exportdir   = $opts{e}  || '/srv/benno/inbox';
my $bennoid     = $opts{i};
my $verbose     = $opts{v};
my $dry_run     = $opts{d};
my $skipmeta    = $opts{s};
my $runuser     = $opts{R}  || 'benno';

if ($opts{V}) {
    print "benno-reimport $VERSION\n";
    exit 0;
}

help_exit() if $opts{h};
help_exit() if not ($bennoid);

Benno->run_as($runuser);

$export::dir = $exportdir;

my $Config = new Benno::Config($configfile);
my @secretheader = $Config->get_secretheader;
my $Container = $Config->get_container($container) or die help_exit('Container does not exist.');
my $repopath = $Container->get_config('repopath');

my $boxstate = $repopath.'/boxstate.xml';
my $Boxstate = new Benno::Boxstate($boxstate);

if ($bennoid eq 'ALL') {
    foreach my $Box ($Boxstate->get_boxes){
        $box::id     = $Box->id;
        my $boxdir = $repopath.'/'.$box::id;
        find({wanted => \&process_file, no_chdir => 1}, $boxdir);
    }
}
else {
    $box::id   = Benno->id2box($bennoid);
    my $subdirs   = $Boxstate->get_box($box::id)->get_config('subdirs');
    my $dirlength = $Boxstate->get_box($box::id)->get_config('dirlength');
    my $idpath = Benno->id2path($bennoid,"$subdirs:$dirlength");

    my $suffix = '';
    if ($Boxstate->get_box($box::id)->get_config('compression') eq 'gzip') {
        $suffix = '.gz';
    }

    my $found = 0;
    # BennoID = Checksum + suffix (00)
    foreach my $bfile (glob("$repopath/$idpath".'*'.$suffix)) {
        $File::Find::name = $bfile;

        process_file();
        $found++;
    }
    if (!$found) {
        print STDERR "NOT FOUND: $repopath/$idpath*$suffix\n";
    }
}



### SUBS ###########################################################
sub process_file
{
    my $filename = $File::Find::name;

    -d $filename             && return undef;
    $filename =~ m!/journal! && return undef;

    my $BennoMailfile;
    eval {
        $BennoMailfile = new Benno::Mailfile($box::id,$File::Find::name,@secretheader);
    };
    if ($@) {
        print STDERR "WARN $File::Find::name: $@";
        return;
    }

    print 'Process '.$BennoMailfile->filename."\n" if $verbose;

    my $exportfile;
    if (!$dry_run) {
        eval {
            $exportfile = $BennoMailfile->export($export::dir);
        };
        if ($@) {
            print STDERR $@;
            return;
        }
        print "Export $exportfile \n" if $verbose;
    }
}



### help_exit()
sub help_exit
{
    my $msg = shift;

    if ($msg) {
        print "$msg\n";
        print "\n";
    }

    print "Usage: $0 -i <bennoid|ALL> [-e <exportdir>] [-d] [-R <userid>] [-v]\n";
    print "\n";
    print "    -c <config>    Benno Mailarchive config file (default: /etc/benno/benno.xml)\n";
    print "    -C <container> Container (default: BennoContainer)\n";
    print "    -r <repodir>   repo directory (example: /srv/benno/archive/repo)\n";
    print "    -i <bennoid>   benno id to reimport (ALL: all mails in repo)\n";
    print "    -e             export directory (/srv/benno/inbox)\n";
    print "    -d             dry run\n";
    print "    -R <userid>    run as user\n";
    print "    -v             verbose\n";
    print "    -V             print version\n";
    print "\n";
    
    exit 1;
}
