#!/usr/bin/perl
use lib qw (. .. ./lib);
use FreezeThaw qw(freeze thaw cmpStr safeFreeze cmpStrHard);
use Asterisk::LCR::Importer::CanonicalCSV;
use Asterisk::LCR::Comparer::Dummy;
use Config::Mini;
use warnings;
use strict;

@ARGV || die "Usage: $0 <config_file>";
Config::Mini::parse_file (@ARGV);

my $SORT = Config::Mini::instantiate ("comparer") || Asterisk::LCR::Comparer::Dummy->new();
our @IMPORTERS =  map { !$_->isa ("Asterisk::LCR::Importer::CanonicalCSV") ? Asterisk::LCR::Importer::CanonicalCSV->new (
                                              %{$_},
                                              provider => $_->provider(),
                                              file => $_->target()
                                          ) : $_
                  } Config::Mini::select ('^import:');

$| = 1;


my %prefixes = ();
foreach my $imp ( @IMPORTERS )
{
    print "Importing rates: " . $imp->{target} || $imp->{file};
    print "\n";
    my $new_rates = $imp->rates();
    %prefixes = ( %prefixes, map { $_ => 1 } keys %{$new_rates} ) ;
}


my %importer_rates = ();
my $rates  = {};

print "Sorting rates";
foreach my $prefix ( sort { length ($b) <=> length ($a) } keys %prefixes )
{
    my @rates = ();
    
    foreach my $importer ( @IMPORTERS )
    {
        my $num = $prefix;
        my $prefix_to_rate = $importer_rates{"$importer"} || do {
            $importer_rates{"$importer"} = $importer->rates();
            $importer_rates{"$importer"};
        };
        my $rate = undef;
    
      LOOP:    
        while (length ($num) > 0)
        {
            $rate = $prefix_to_rate->{$num};
            if ($rate)
            {
                push @rates, $rate;
                last LOOP;
            }
            
            chop ($num);
        }
    }

    $rates->{$prefix} = [ sort { $SORT->sortme ($a, $b) } @rates ];
}
print "\n";


_rm_rf ("lcr_db");
print "Building LCR object tree";
foreach my $prefix ( keys %{$rates} )
{
    @{$rates->{$prefix}} || next;

    my $dir = join '/', split //, $prefix;
    $dir    = "lcr_db/$dir";

    _mkdir_p ($dir);
    
    open FP, ">$dir/index.obj" || die "Cannot write-open $dir/index.obj";
    print FP freeze ( @{$rates->{$prefix}} );
    close FP;

    print ".";
}
print " done.\n";


sub _rm_rf
{
    my $file = shift;
    -e $file or return;
    -d $file and do {
        opendir DD, $file;
        my @subfiles = readdir (DD);
        for (@subfiles)
        {
            /^\.\.?$/ and next;
            _rm_rf ("$file/$_");
        }
        rmdir ($file);
    };
    -f $file and unlink $file;
}


sub _mkdir_p
{
    my $dir = shift || return;
    return if (-d $dir);

    my ($parent, $name) = $dir =~ /(.*)\/(.*)/;
    _mkdir_p ($parent);

    mkdir ($dir);
}


1;


__END__
