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.
###
