package RPS::Import::IRISLegacy;

use strict;

use Date::Calc qw(Days_in_Month);

use lib '/app/tools/common/lib';
use Common::Consts qw(%COUNTRY_TO_CODE);

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

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

use constant FIELD_TITLE    => 0;
use constant FIELD_ARTIST   => 2;
use constant FIELD_ISRC     => 1;
use constant FIELD_UNITPRICE=> 3;
use constant FIELD_UNITS    => 4;
use constant FIELD_COUNTRY  => 5;
use constant FIELD_PRICE    => 10;

my %delivery_formats = (
    'Download'              => RPS::File::Sale::FORMAT_DOWNLOAD,
    'Stream'                => RPS::File::Sale::FORMAT_STREAM,
    'Limited Download'      => RPS::File::Sale::FORMAT_DOWNLOAD,
    'Over the Air Download' => RPS::File::Sale::FORMAT_DOWNLOAD,
    'Ringtone'              => RPS::File::Sale::FORMAT_RINGTONE,
    'Ringback'              => RPS::File::Sale::FORMAT_RINGBACK,
    'Over the Air Download' => RPS::File::Sale::FORMAT_DOWNLOAD,
    'Burn'                  => RPS::File::Sale::FORMAT_DOWNLOAD,
    'Other'                 => RPS::File::Sale::FORMAT_STREAM,
    'Play'                  => RPS::File::Sale::FORMAT_STREAM,
    'Realtone'              => RPS::File::Sale::FORMAT_RINGTONE,
);

my @data_delivery_formats = ('Download','Stream','Burn','Limited Download','Other','Play');

#
# public methods
#

sub _importLines
{
    my $self = shift;
    my %args = @_;
    my $lines = $args{lines};
    return undef unless ($lines);
    #my $version = $args{version}; # cmd-line testing
    my $version = $args{file}->VersionNum();
    #my $fileName = $args{OrigFileName}; # cmd-line testing
    my $fileName = $args{file}->OrigFileName();
    my %buffer = ();
    my $linenum = 1;
    my $format = RPS::File::Sale::FORMAT_DOWNLOAD;
    my $sheet_count = 0;
    my $was_album_title = 0;
    my (%errors,$passed_format,$album,$dateBegin,$dateEnd,$total_columns,$fee_percentage,$x,$y);
    my $country = "US";

    foreach my $sheet(@{ $args{sheets} }) {
        my $linenum = 1;
        foreach my $line (@$sheet)
        {
            my $artist      = $line->[FIELD_ARTIST];
            my $isrc        = $line->[FIELD_ISRC];
            my $title       = $line->[FIELD_TITLE];
            if($sheet_count == 0) {
                $buffer{$isrc}{artist} = $artist;
                $buffer{$isrc}{isrc} = $isrc;
                $buffer{$isrc}{title} = $title;
                if($line->[0] =~ /Start Date/i) {
                   ($dateBegin, $dateEnd) = _get_dates($line->[FIELD_ISRC]);
                    unless ($dateBegin && $dateEnd)
                    {
                        $self->errstr("couldn't get dates");
                        print STDERR "file name: $fileName\n";
                        return undef;
                    }
                }
                elsif(($artist ne "")&&($artist ne "Artist")&&($title =~ /(\d{4})\:\s([a-zA-Z])/)) {
                    $album = $title;
                    $album =~ s/^.*[^:]:\s//;
                    $buffer{$isrc}{album} = $album;
                    $was_album_title = 1;
                }
                elsif($album ne "") {
                    $buffer{$isrc}{album} = $album;
                }
                if($buffer{$isrc}{artist} ne "" && $buffer{$isrc}{album} ne "") {
                    $title = $line->[FIELD_TITLE];
                    $buffer{$isrc}{title} = $title;
                    if($was_album_title == 1) {
                        $buffer{$isrc}{is_album} = 1;
                        $was_album_title = 0
                    }
                    for ($y=0;$y<@data_delivery_formats;$y++) {
                        if(($line->[$y+3] !~ /Artist|UPC\/ISRC|Gross|Fee|Net/)&&($line->[$y+3] ne "")) {
                            $buffer{$isrc}{units}[$y] = $line->[$y+3];
                            $buffer{$isrc}{units}[$y] =~ m/^(\d+)$/;
                            $buffer{$isrc}{linenum} = $linenum;
                        }
                        $buffer{$isrc}{format}[$y] = $delivery_formats{$data_delivery_formats[$y]};
                    }
                }
            }
            elsif($line->[0] =~ /percent split/i && $sheet_count == 1) {
                $fee_percentage = $line->[1];
                $fee_percentage =~ s/\D//g;
                $fee_percentage *= .01;
            }
            elsif(($sheet_count == 1)&&($artist ne "Artist" && $title ne "")) {
                for($y=0;$y<@data_delivery_formats;$y++) {
                    if($buffer{$isrc}{units}[$y]>0) {
                        my $price = sprintf("%.8f",($line->[$y+3]/$buffer{$isrc}{units}[$y]));
                        $buffer{$isrc}{price}[$y] = sprintf("%.8f",($line->[$y+3]/$buffer{$isrc}{units}[$y]));
                    }
                }
            }
            $linenum++;
        }
        $sheet_count++;
    }
    for my $key(sort { $buffer{$a}{linenum} <=> $buffer{$b}{linenum} } keys %buffer) {
        if($buffer{$key}{artist} ne "" && $buffer{$key}{album} ne "") {
            for($y=0;$y<@data_delivery_formats;$y++) {
                if(($buffer{$key}{units}[$y]>0)&&($buffer{$key}{price}[$y]>0)) {
                    my $sale = RPS::Import::SaleRec->new();
                    if($buffer{$key}{is_album}==1) {
                        $sale->productType(RPS::File::Sale::TYPE_ALBUM);
                        $sale->upc($buffer{$key}{isrc});
                    }
                    else {
                        $sale->productType(RPS::File::Sale::TYPE_TRACK);
                        $sale->trackName($buffer{$key}{title});
                        $sale->isrc($buffer{$key}{isrc});
                    }
                    $sale->albumName($buffer{$key}{album});
                    $sale->formatType($buffer{$key}{format}[$y]);
                    $sale->dateBegin($dateBegin);
                    $sale->dateEnd($dateEnd);
                    $sale->artistName($buffer{$key}{artist});
                    my $price = $buffer{$key}{price}[$y];
                    my $fee = sprintf("%.8f",($price*$fee_percentage));
                    $price -= sprintf("%.8f",$fee);
                    $sale->price($price);
                    $sale->units($buffer{$key}{units}[$y]);
                    $sale->countryCode($country);
                    $sale->lineNum($buffer{$key}{linenum});
                    #$args{dumper}($sale); ## for cmd-line testing
                    $self->_insertSale(sale => $sale);
                }
            }
        }
        #else { print STDERR "skip " . $key . "\n"; }
    }
    return $linenum;
}

#
# Private methods
#

sub _get_dates
{
    my $passed_date = shift;
    return undef unless ($passed_date =~ m/(\d+)\D(\d{4})/);
    my ($month, $year) = ($1, $2);

    return (
        sprintf("%04d-%02d-01", $year, $month), 
        sprintf("%04d-%02d-%02d", $year, $month, Days_in_Month($year, $month))
    );
}

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