package RPS::Import::DJDownload;

use strict;

use Date::Calc qw(Days_in_Month Add_Delta_Days Decode_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';

# map version num to the field order
my %fieldMap = (
    1 => {
        tracks_royalty_str_col => 0,
        tracks_royalty_val_col => 1,

        #service     => 0,
        label        => 1,
        type         => 2,
        track        => 3,
        catalog      => 4,
        isrc         => 5,
        units        => 8,
        price        => 16,
        track_free   => 2,
        isrc_free    => 4,
        units_free   => 5,
        price_free   => 8,
        catalog_free => 3,
    },
    2 => {
        tracks_royalty_str_col => 0,
        tracks_royalty_val_col => 1,

        #service     => 0,
        label        => 1,
        type         => 2,
        track        => 3,
        artist       => 4,
        catalog      => 7,
        isrc         => 8,
        units        => 11,
        price        => 19,
        track_free   => 2,
        isrc_free    => 4,
        units_free   => 5,
        catalog_free => 3,
        price_free   => 8,
    },
);

#public methods

sub _importLines {
    my $self = shift;
    my %args = @_;

    my $fileObj     = $args{file};
    my $version     = $args{file}->VersionNum();
    my $fileName    = $args{file}->OrigFileName();
    my $sheet_count = 0;

    return undef unless ( defined $args{sheets} && defined $version );

    my $offsets      = $fieldMap{$version};
    my $sheet_names  = $args{sheet_names};
    my $header_found = 0;
    my $linenum      = 1;
    my $format       = RPS::File::Sale::FORMAT_DOWNLOAD;
    my $product_type;
    my ( $dateBegin, $dateEnd ) = $self->_getDates( date_begin => $fileName, type => 'quarter' );

    unless ( defined $dateBegin && defined $dateEnd ) {
        $self->errstr( "couldn't get dates from " . $fileName );
        return undef;
    }

    my $currency = "GBP";
    my $country  = "GB";
    my $purchase_track_royalty;
    my $free_track_royalty;
    my $total_royalty_due;
    my $royalty_deduction;

    foreach my $sheet ( @{ $args{sheets} } ) {
        print STDERR "processing sheet: " . $sheet_names->[$sheet_count] . "\n";
        if ( $sheet_names->[$sheet_count] !~ /stock/i ) {
            $linenum = 1;

            foreach my $line (@$sheet) {

                if ( $sheet_names->[$sheet_count] =~ /summary/i ) {
                    my $roy_str = $line->[ $offsets->{tracks_royalty_str_col} ];

                    if ( $roy_str =~ /purchase tracks royalty/i ) {
                        $purchase_track_royalty = $line->[ $offsets->{tracks_royalty_val_col} ];
                    }

                    if ( $roy_str =~ /free tracks royalty/i ) {
                        $free_track_royalty = $line->[ $offsets->{tracks_royalty_val_col} ];
                    }

                    if ( $roy_str =~ /total royalty due/i ) {
                        $total_royalty_due = $line->[ $offsets->{tracks_royalty_val_col} ];
                    }
                } elsif ( !defined $royalty_deduction ) {
                    if (   $purchase_track_royalty =~ /\d+/
                        && $free_track_royalty =~ /\d+/
                        && $total_royalty_due =~ /\d+/ ) {
                        $royalty_deduction = 1 - ( $total_royalty_due / ( $purchase_track_royalty + $free_track_royalty ) );
                    } else {
                        $self->errstr("Could not calculate royalty deduction from summary page");
                        return undef;
                    }
                }

                my $free_flag = 0;
                $free_flag = 1 if ( $sheet_names->[$sheet_count] =~ /free/i );

                #my $service = $line->[$offsets->{service}];
                my $label   = $line->[ $offsets->{label} ];
                my $title   = $line->[ $offsets->{track} ];
                my $price   = $line->[ $offsets->{price} ];
                my $units   = $line->[ $offsets->{units} ];
                my $isrc    = $line->[ $offsets->{isrc} ];
                my $artist  = $line->[ $offsets->{artist} ];
                my $catalog = $line->[ $offsets->{catalog} ];
                my $upc;

                if ( !$free_flag && lc( $line->[ $offsets->{type} ] ) =~ /album/ ) {
                    $product_type = RPS::File::Sale::TYPE_ALBUM;
                    $upc          = $isrc;
                } else {
                    $product_type = RPS::File::Sale::TYPE_TRACK;
                }

                #$service    =~ s/\(.*$//;
                #my $serviceID = $self->getServiceID($service);

                if ($free_flag) {
                    $title        = $line->[ $offsets->{track_free} ];
                    $units        = $line->[ $offsets->{units_free} ];
                    $isrc         = $line->[ $offsets->{isrc_free} ];
                    $price        = $line->[ $offsets->{price_free} ];
                    $catalog      = $line->[ $offsets->{catalog_free} ];
                    $artist       = "";
                    $product_type = RPS::File::Sale::TYPE_TRACK;
                }

                $price = $price - ( $royalty_deduction * $price );

                $price /= $units if ( $units > 1 );

                if (
                    ( $units && $price && $title && $format && $title ne "Track" )
                    || (   ( $version == 2 )
                        && $title
                        && $units
                        && $format
                        && $product_type
                        && ( $title ne "Track" ) )
                  ) {

                    #unless (defined $serviceID) {
                    #    $self->
                    #    errstr("couldn't get service ID from ".
                    #    $line->[$offsets->{service}]." at line number $linenum");
                    #    return undef;
                    #}

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

                    $sale->artistName($artist) if ( $artist && $version == 2 );
                    $sale->productType($product_type);
                    $sale->dateBegin($dateBegin);
                    $sale->dateEnd($dateEnd);

                    if ( $product_type eq RPS::File::Sale::TYPE_TRACK ) {
                        $sale->trackName($title);
                    } elsif ( $product_type eq RPS::File::Sale::TYPE_ALBUM ) {
                        $sale->albumName($title);
                    }

                    $sale->clientProductID($catalog);
                    $sale->formatType($format);
                    $sale->labelName($label);

                    #$sale->serviceID($serviceID);
                    $sale->isrc($isrc) if ( $product_type eq RPS::File::Sale::TYPE_TRACK );
                    $sale->upc($upc)   if ($upc);
                    $sale->units($units);
                    $sale->price($price);

                    $sale->countryCode($country);
                    $sale->currencyCode($currency);
                    $sale->lineNum($linenum);

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

#else { print STDERR "Skipping s: " . $sheet_names->[$sheet_count] . " l: " . $linenum . " - u:".$units." p:".$price." a:".$artist." t:".$title." f:".$format."\n"; }
                $linenum++;
            }
        }
        $sheet_count++;
    }
    return $linenum;
}

#
# Private methods
#

#sub _getDates
#{
#	my $passed_date = shift;
#    my ($month,$year,$qtr,$dateBegin,$dateEnd);
#    if($passed_date =~ m/\_Q(\d)\_(\d{4})/) {
#        $qtr = $1;
#        $year = $2;
#    }
#    elsif($passed_date =~ m/(\d{4})\sQ(\d)/) {
#        $qtr = $2;
#        $year = $1;
#    }
#    elsif($passed_date =~ m/ Q(\d) (\d{4})/) {
#        $qtr = $1;
#        $year = $2;
#    }
#    if($qtr ne "" && $year ne "") {
#        if ($qtr == 1) {
#            $dateBegin = $year."-01-01";
#            $dateEnd   = $year."-03-".Days_in_Month($year, 3);
#        } elsif ($qtr == 2) {
#            $dateBegin = $year."-04-01";
#            $dateEnd   = $year."-06-".Days_in_Month($year, 6);
#        } elsif ($qtr == 3) {
#            $dateBegin = $year."-07-01";
#            $dateEnd   = $year."-09-".Days_in_Month($year, 9);
#        } elsif ($qtr == 4) {
#            $dateBegin = $year."-10-01";
#            $dateEnd   = $year."-12-".Days_in_Month($year, 12);
#        } else {
#            return undef;
#        }
#        return ($dateBegin, $dateEnd);
#    }
#    else {
#        return undef;
#    }
#}

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