package RPS::Import::MusicAirport;

use strict;

use Data::Dumper;
use Date::Calc qw(Days_in_Month);

use lib '/app/tools/common/lib';
use Common::Util;

use lib '/app/tools/data_classes/lib';

use lib '/app/tools/rps/lib';
use RPS::File::Sale;
use base 'RPS::Import::Importer';

my %field_map = (
    1 => {
        svc_prod_id => 0,
        isrc        => 2,
        track       => 3,
        artist      => 11, 
    },
    2 => {
        svc_prod_id => 0,
        isrc        => 1,
        track       => 3,
        artist      => 11, 
    },
    # v3 is similar to v1 but we'll keep it separate in case we start to care about
    # some of the other fields that _are_ different
    3 => {
        svc_prod_id => 0,
        isrc        => 2,
        track       => 3,
        artist      => 11, 
    },
    # similar to v3
    4 => {
        svc_prod_id => 0,
        isrc        => 2,
        track       => 3,
        artist      => 11, 
    },
);

sub _importLines
{
    my $self = shift;
    my %args = @_;

    my $fileObj = $args{file};
    my $fileName = $fileObj->OrigFileName;
    my $version = $fileObj->VersionNum;
    #my $fileName = $args{OrigFileName};
    #my $version = $args{version};

    my $offsets = $field_map{$version};
    my $lines = $args{lines};
    return 0 unless ($lines);

    my ($dateBegin, $dateEnd, $distributors) = $self->_getDatesAndDistributors($lines);
    unless ($dateBegin && $dateEnd)
    {
        $self->errstr("couldn't get dates");
        return undef;
    }
    unless (ref $distributors eq 'ARRAY' and scalar @$distributors > 0)
    {
        $self->errstr("couldn't get services");
        return undef;
    }

    my $prodType = RPS::File::Sale::TYPE_TRACK;
    my $format = RPS::File::Sale::FORMAT_DOWNLOAD;
    my $linenum = 1;
    foreach my $line(@$lines)
    {
        my $svcProd = $line->[$offsets->{svc_prod_id}];
        my $isrc    = Common::Util::normalize_isrc($line->[$offsets->{isrc}]);
        my $track   = $line->[$offsets->{track}];
        my $artist  = $line->[$offsets->{artist}];

        if ($track && $artist && $svcProd =~ m/\d+/)
        {
            my $sale = RPS::Import::SaleRec->new();

            $sale->productType($prodType);
            $sale->formatType($format);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->serviceProductID($svcProd);
            $sale->isrc($isrc);
            $sale->artistName($artist);
            $sale->trackName($track);
            $sale->lineNum($linenum);
            $sale->currencyCode('JPY');
            $sale->countryCode('US');
    
            foreach my $dist(@$distributors)
            {
                my ($units) = $line->[ $dist->{offset} ] =~ m/^(\d+)$/;
                my ($price) = $line->[ $dist->{offset} + 1 ] =~ m/^(\d+)$/;

                if ($units > 0 && $price > 0)
                {
                    $price /= $units;
                    $sale->serviceID($dist->{serviceID});
                    $sale->units($units);
                    $sale->price($price);
                    #$args{dumper}($sale);  ## for cmd-line testing
                    $self->_insertSale(sale => $sale);
                }
            }
        }#else { print STDERR "skip $linenum\n"; }
        $linenum++;
    }
    return $linenum;
}

#
# Private methods
#

sub _getDatesAndDistributors
{
    my $self = shift;
    my $lines = shift;

    my ($monthBegin, $year);
    # 'Period:' is declared somewhere within the first 15 lines
    my $i = 0;
    DATE:
    for ($i=0; $i<15; $i++)
    {
        for (my $j=0; defined $lines->[$i][$j]; $j++)
        {
            if (lc $lines->[$i][$j] eq 'period:')
            {
                ($monthBegin, $year) = split /\s*\/\s*/, $lines->[$i][$j+1];
                last DATE;
            }
        }
    }
    return undef unless $year;

    my $monthEnd;
    if ($monthBegin =~ m#(\d+)\D+(\d+)#) # month range
    {
        ($monthBegin, $monthEnd) = ($1,$2);
    }
    else # single month
    {
        $monthEnd = $monthBegin;
    }

    my @dist;
    # continue where $i left off
    DIST:
    for (;$i<25; $i++)
    {
        if (lc $lines->[$i][0] eq 'id')
        {
            for (my $j=1; defined $lines->[$i][$j]; $j++)
            {
                if (lc $lines->[$i][$j] eq 'royalty')
                {
                    $j++;
                    $j++ unless (length $lines->[$i][$j]); # Royalty may occupy 2 cols
                    while (defined $lines->[$i][$j])
                    {
                        last if (lc $lines->[$i][$j] eq 'total royalty');
                        if (my $serviceID = $self->getServiceID($lines->[$i][$j]))
                        {
                            push @dist, {
                                serviceID => $serviceID,
                                offset => $j,
                            };
                        }
                        else
                        {
                            $self->warning();
                            print STDERR "can't map service: $lines->[$i][$j]\n";
                        }
                        $j += 2;
                    }
                    last DIST;
                }
            }
        }
    }

    return (
        Common::Util::normalize_date(join('-', $year, $monthBegin,1)),
        Common::Util::normalize_date(join('-', $year, $monthEnd, Days_in_Month($year, $monthEnd))),
        \@dist,
   );
}

###
1;# Play nicely.
###
