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