package RPS::Import::PlayNetwork;

use strict;

use Date::Calc qw(Days_in_Month);

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

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';

use constant DATE_COL => 0;
use constant DATE_ROW => 2;

my %field_map = (
    1 => {
        date_col => 0,
        date_row => 2,
        track    => 0,
        album    => 1,
        artist   => 2,
        units    => 3,
    },
    2 => {
        date_col => 0,
        date_row => 2,
        track    => 0,
        isrc     => 1,
        album    => 2,
        artist   => 3,
        units    => 4,
    },
    3 => {
        date_col   => 1,
        date_row   => 4,
        track      => 0,
        isrc       => 1,
        album      => 2,
        artist     => 3,
        units      => 5,
        unit_price => 6,
    },
    4 => {
        date_col   => 0,
        date_row   => 0,
        track      => 0,
        isrc       => 1,
        album      => 2,
        artist     => 3,
        units      => 5,
        unit_price => 6,
    },
    5 => {
        date_col => 0,
        date_row => 2,
        track    => 0,
        isrc     => 1,
        album    => 2,
        artist   => 3,
        units    => 4,
        price    => 5,
    },
);

#public methods

sub _importLines {
    my $self     = shift;
    my %args     = @_;
    my $fileObj  = $args{file};
    my $version  = $args{file}->VersionNum();
    my $fileName = $fileObj->OrigFileName;
    my $offsets  = $field_map{$version};

    my $retval = undef;
    my $sheets = $args{sheets};

    my ( $dateBegin, $dateEnd );

    my $linenum = 1;

    foreach my $lines (@$sheets) {
        my $dateStr = '';
        if ( ( $version < 3 ) || ( $version == 5 ) ) {
            $dateStr = $lines->[ $offsets->{date_row} ]->[ $offsets->{date_col} ];
        } elsif ( $version == 3 ) {
            $dateStr = $lines->[ $offsets->{date_row} ]->[ $offsets->{date_col} ] . " - "
              . $lines->[ $offsets->{date_row} ]->[ $offsets->{date_col} + 2 ];
        } elsif ( $version == 4 ) {
            $dateStr = $fileName;
        }

        ( $dateBegin, $dateEnd ) = $self->_getDates($dateStr) if ($dateStr);

        unless ( $dateBegin && $dateEnd ) {
            $self->errstr("couldn't get dates");
            print STDERR "bad date format: $dateStr\n";
            return undef;
        }

        # Removed version-specfic offsets. See case FB13782.
        #$linenum = 4 if ($version==5);
        #$linenum = 2 if ($version==4);
        #$linenum = 2 if ($version==3);
        #$linenum = 5 if ($version==2);
        #$linenum = 7 if ($version==1);
        my $last_track = "";
        foreach my $line (@$lines) {

            my $prodtype = RPS::File::Sale::TYPE_TRACK;
            my $format   = RPS::File::Sale::FORMAT_BACKGROUNDMUSIC;
            $format = RPS::File::Sale::FORMAT_STREAM if ( $version == 4 );
            my $artist  = $line->[ $offsets->{artist} ];
            my $album   = $line->[ $offsets->{album} ];
            my $track   = $line->[ $offsets->{track} ];
            my $isrc    = $line->[ $offsets->{isrc} ] if ( $version > 1 );
            my ($units) = $line->[ $offsets->{units} ] =~ m/^(\d+)$/;
            my $price;

            $isrc =~ s/-//g;

            if ( $version == 5 ) {

                #$price = $line->[$offsets->{price}] =~ m/^(\d+\.?\d*)$/;
                $price = $line->[ $offsets->{price} ] if ( $line->[ $offsets->{price} ] =~ m/^(\d+\.?\d*)$/ );

                #print STDERR "Price: $price\n";
                $price /= $units if ( $units > 0 );
            } elsif ( exists $offsets->{unit_price} ) {
                $price = $line->[ $offsets->{unit_price} ];
            }

            $track = $last_track if ( $last_track ne "" && $track eq "" && $version != 4 );

            #print STDERR "In loop price: $price\n";

            if (   ( $units && $track ne "" && $track !~ /title/i && $track !~ /2007/ && $artist ne "-" )
                || ( $version == 5 && $price ) ) {

                #print STDERR "Made it past if price: $price\n";

                unless ( $dateBegin && $dateEnd ) {
                    $self->errstr( "couldn't get dates from " . $lines->[ $offsets->{date_row} ]->[ $offsets->{date_col} ] );
                    return undef;
                }

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

                $sale->productType($prodtype);
                $sale->formatType($format);
                $sale->dateBegin($dateBegin);
                $sale->dateEnd($dateEnd);
                $sale->artistName($artist);
                $sale->trackName($track);
                $sale->albumName($album) if ( $album ne "" );
                $sale->isrc($isrc) if ( ( $version > 1 ) && ( $isrc ne "" ) );
                $sale->units($units);
                $sale->lineNum($linenum);
                $sale->price($price) if ( $price ne "" );
                $sale->countryCode('US');

                #$args{dumper}($sale);  ## for cmd-line testing
                $self->_insertSale( sale => $sale );
            }

            #else { print STDERR "Skipping-> a: ".$artist." t:".$track." a:".$album." u:".$units." l:".$linenum."\n";}
            $last_track = $track;
            $linenum++;
        }
    }
    return $linenum;
}

#
# Private methods
#

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

    my ( $beginDate, $endDate );

    if ( $date =~ m/^Q(\d) (\d{4})/ ) {
        my $qtr  = $1;
        my $year = $2;
        if ( $qtr == 1 ) {
            $beginDate = $year . "-01-01";
            $endDate = $year . "-03-" . Days_in_Month( $year, 3 );
        } elsif ( $qtr == 2 ) {
            $beginDate = $year . "-04-01";
            $endDate = $year . "-06-" . Days_in_Month( $year, 6 );
        } elsif ( $qtr == 3 ) {
            $beginDate = $year . "-07-01";
            $endDate = $year . "-09-" . Days_in_Month( $year, 9 );
        } elsif ( $qtr == 4 ) {
            $beginDate = $year . "-10-01";
            $endDate = $year . "-12-" . Days_in_Month( $year, 12 );
        }
    } elsif ( $date =~ m/(\d)Q(\d\d)/ ) {
        my $qtr  = $1;
        my $year = $2 + 2000;
        if ( $qtr == 1 ) {
            $beginDate = $year . "-01-01";
            $endDate = $year . "-03-" . Days_in_Month( $year, 3 );
        } elsif ( $qtr == 2 ) {
            $beginDate = $year . "-04-01";
            $endDate = $year . "-06-" . Days_in_Month( $year, 6 );
        } elsif ( $qtr == 3 ) {
            $beginDate = $year . "-07-01";
            $endDate = $year . "-09-" . Days_in_Month( $year, 9 );
        } elsif ( $qtr == 4 ) {
            $beginDate = $year . "-10-01";
            $endDate = $year . "-12-" . Days_in_Month( $year, 12 );
        }
    } elsif ( $date =~ m/(\d+)\/(\d+)\/(\d+)\s+-\s+(\d+)\/(\d+)\/(\d+)$/ ) {
        $beginDate = sprintf( "%04d-%02d-%02d", $3, $1, $2 );
        $endDate   = sprintf( "%04d-%02d-%02d", $6, $4, $5 );
    } elsif ( $date =~ m/(\d{4})\D(\d+)\D(\d+)\s-\s(\d{4})\D(\d+)\D(\d+)$/ ) {
        $beginDate = sprintf( "%04d-%02d-%02d", $1, $2, $3 );
        $endDate   = sprintf( "%04d-%02d-%02d", $4, $5, $6 );
    } else {
        return undef;
    }

    return ( $beginDate, $endDate );
}

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