package RPS::Import::StreamWaves;

use strict;

use Date::Calc qw(Days_in_Month);

use lib '/app/tools/common/lib';
use Common::Util qw(normalize_upc normalize_isrc);

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

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

my %field_map = (
    1 => {
        date_sheet  => 0,
        date_row    => 0,
        date_col    => 1,
        sheet       => 2,
        label       => 0,
        artist      => 1,
        album       => 2,
        track       => 3,
        units       => 4,
        price       => 5,
    },
    2 => {
        date_sheet  => 0,
        date_row    => 0,
        date_col    => 1,
        sheet       => 2,
        svc_prod_id => 0,
        isrc        => 1,
        upc         => 2,
        label       => 3,
        artist      => 4,
        album       => 5,
        track       => 6,
        units       => 7,
        price       => 8,
    },
    3 => {
        date_sheet  => 0,
        date_row    => 0,
        date_col    => 1,
        sheet       => 2,
        upc         => 0,
        isrc        => 1,
        label       => 2,
        artist      => 3,
        album       => 4,
        track       => 5,
        units       => 6,
        price       => 7,
    },
    4 => {
        date_sheet  => 0,
        date_row    => 0,
        date_col    => 0,
        sheet       => 0,
        track       => 1,
        album       => 3,
        artist      => 4,
        upc         => 5,
        isrc        => 6,
        units       => 8,
        price       => 9,
        label       => 11,
    },
);


# public methods

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

    my $sheets = $args{sheets};
    my $fileObj = $args{file};
    my $version = $fileObj->VersionNum;
    # for cmd-line testing
    #my $version = $args{version};

    my $offsets = $field_map{$version};
    my $lines = $sheets->[$offsets->{sheet}];
    return 0 unless ($lines);

    my $dateString = $sheets->[$offsets->{date_sheet}][$offsets->{date_row}][$offsets->{date_col}];
    my ($dateBegin, $dateEnd) = $self->_getDates($dateString);
    unless ($dateBegin && $dateEnd)
    {
        $self->errstr("couldn't get dates");
        print STDERR "date: $dateString\n";
        return undef;
    }

    my $linenum = 1;
    my $prodtype = RPS::File::Sale::TYPE_TRACK;
    my $format = RPS::File::Sale::FORMAT_STREAM;

    foreach my $line(@$lines)
    {
        my $svc_prod_id = $line->[$offsets->{svc_prod_id}];
        my $isrc    = normalize_isrc($line->[$offsets->{isrc}]);
        my $upc     = normalize_upc($line->[$offsets->{upc}]);
        my $label   = $line->[$offsets->{label}];
        my $artist  = $line->[$offsets->{artist}];
        my $album   = $line->[$offsets->{album}];
        my $track   = $line->[$offsets->{track}];
        my ($units) = $line->[$offsets->{units}] =~ m/^(\d+)$/;
        my $price   = $line->[$offsets->{price}];

        if ($units && $price =~ /\d+/ && $album && $track)
        {
            $price /= $units;

            my $sale = RPS::Import::SaleRec->new();

            $sale->productType($prodtype);
            $sale->formatType($format);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->serviceProductID($svc_prod_id);
            $sale->upc($upc);
            $sale->isrc($isrc);
            $sale->artistName($artist);
            $sale->albumName($album);
            $sale->trackName($track);
            $sale->labelName($label);
            $sale->units($units);
            $sale->price($price);
            $sale->lineNum($linenum);
    
            #$args{dumper}($sale);  ## for cmd-line testing
            $self->_insertSale(sale => $sale);
        } #else { print STDERR "skip: u: $units p: $price t: $track a: $album r: $artist\n"; }
        $linenum++;
    }
    return $linenum;
}

#
# Private methods
#

sub _getDates
{
    my $self = shift;
    my $timeFrame = shift;

    my ($d1, $d2);
    if ($timeFrame =~ m/\s*Q(\d)\D+(\d{4})\D/) # Q1 2004 Royalties Report
    {
        my ($month, $year) = ($1 * 3, $2);
        return undef unless ($month && $year);

        $d1 = sprintf("%d-%02d-01", $year, $month-2);
        $d2 = sprintf("%d-%02d-%02d", $year, $month, Days_in_Month($year, $month));
    }
    elsif ($timeFrame =~ m/^(\d\d)\d\d(\d{4})\D(\d\d)\d\d(\d{4})/) # 10012003_12312003
    {
        my ($m1, $y1, $m2, $y2) = ($1, $2, $3, $4);
        print "m1 $m1 m2: $m2 y1: $y1 y2: $y2\n";
        return unless ($m1 && $y1 && $m2 && $y2);

        $d1 = sprintf("%d-%02d-01", $y1, $m1);
        $d2 = sprintf("%d-%02d-%02d", $y2, $m2, Days_in_Month($y2, $m2));
    }

    return ($d1, $d2);
}


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