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