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