package RPS::Import::ADAUK;

use strict;

use Date::Calc qw(Days_in_Month Add_Delta_Days Decode_Month);

use lib '/app/tools/common/lib';
use Common::Country;

use lib '/app/tools/data_classes/lib';
use Client::Service;

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

my %fieldMap = (
    10 => {
        'UK Digital Sales' => {
            album          => 0,        
            artist         => 1,        
            track          => 2,      
            service_id     => 3,  
            isrc           => 4,
            upc            => 5,
            date_begin     => 6,
            service        => 7,
            format_type    => 9,
            media_type     => 10,
            product_type   => 11,
            format_subtype => 12,
            units          => 13,
            price          => 14,
        },
        'International Digital Sales' => {
            album          => 0,        
            artist         => 1,        
            track          => 2,      
            service_id     => 3,  
            isrc           => 4,
            upc            => 5,
            date_begin     => 6,
            country        => 7,       
            service        => 8,
            format_type    => 10,
            media_type     => 11,
            product_type   => 12,
            format_subtype => 13,
            units          => 14,
            price          => 15,
        },        
    },
);

my %format_map = (
    'ALBUM'                 => RPS::File::Sale::FORMAT_DOWNLOAD,
    'INTERACTIVE ALBUM'     => RPS::File::Sale::FORMAT_DOWNLOAD,
    'FULL LENGTH'           => RPS::File::Sale::FORMAT_DOWNLOAD,
    'MASTERTONE'            => RPS::File::Sale::FORMAT_RINGTONE,
    'RINGBACKTONE'          => RPS::File::Sale::FORMAT_RINGTONE,
    'MUSIC VIDEO RINGER'    => RPS::File::Sale::FORMAT_DOWNLOAD,
    'SINGLE'                => RPS::File::Sale::FORMAT_DOWNLOAD,
    'SINGLE TRACK'          => RPS::File::Sale::FORMAT_DOWNLOAD,
    'TRACK (STEP)'          => RPS::File::Sale::FORMAT_DOWNLOAD,
    'WALLPAPER'             => 'SKIP',
);

my %product_map = (
    'ALBUM'                         => RPS::File::Sale::TYPE_ALBUM,
    'FULL LENGTH'                   => RPS::File::Sale::TYPE_ALBUM,
    'SINGLE'                        => RPS::File::Sale::TYPE_ALBUM,
    'FULL LENGTH RECORDING (TRACK)' => RPS::File::Sale::TYPE_TRACK,
    'SINGLE TRACK'                  => RPS::File::Sale::TYPE_TRACK,
    'AUDIO CLIP'                    => RPS::File::Sale::TYPE_TRACK,
    'VIDEO CLIP'                    => RPS::File::Sale::TYPE_TRACK,   
    'WALLPAPER'                     => 'SKIP',   
);

my %media_map = (
    'AUDIO'                         => '1',
    'VIDEO'                         => '2',
    'IMAGE'                         => 'SKIP',   
);


#public methods

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

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

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

	my $offsets = $fieldMap{$version};
    my $sheet_names = $args{sheet_names};   
    
    my $linenum = 1;
    foreach my $sheet(@{ $args{sheets} }) {
        
        my $sheetName = $sheet_names->[$sheet_count];
        my $data = $offsets->{$sheetName};           
        
        if ( !$data )
        {
            $sheet_count++;
            next;
        }

        $linenum = 1;
        my $lines = $sheet;
        foreach my $line (@$sheet) {
            
            my $prodType = $product_map{uc ($line->[$data->{product_type}])};
            my $mediaType = $media_map{uc ($line->[$data->{media_type}])};
            my $format;

            if (uc ($line->[$data->{format_type}]) eq 'DOWNLOAD')
            {   
                $format = $format_map{uc ($line->[$data->{format_subtype}])}; 
            }
            elsif (uc ($line->[$data->{format_type}]) eq 'STREAM')
            {
                $format = RPS::File::Sale::FORMAT_STREAM;           
            }       
                     
            my $artist              = $line->[$data->{artist}];;
            my $date                = $line->[$data->{date_begin}];
            my $track               = $line->[$data->{track}];
            my $album               = $line->[$data->{album}];
            my $units               = $line->[$data->{units}];
            my $price               = $line->[$data->{price}];
            my $isrc                = $line->[$data->{isrc}];
            my $upc                 = $line->[$data->{upc}];
            my $serviceName         = $line->[$data->{service}];
            my $country             = "UK";
            my $currency            = "GBP"; 
            $price                  /= $units if($units != 0);

            if ($artist && $units && ($track && $track !~ /TITLE/ || $album && $album !~ /PROJECT/) && $prodType ne 'SKIP' && $mediaType ne 'SKIP' && $format ne 'SKIP') {
                
                if (defined $data->{country})
                {
                    my $f_country = $line->[$data->{country}];
                  	my $c = Common::Country->Get( $f_country );
	
                    $self->fail( "Unable to determine country code from '$f_country'" ) unless( $c && $c->alpha2 );

                    $country = $c->alpha2;
                }                

                if ( $units > 0 &&  $price < 0 )
                {
                    $units *= -1;
                    $price *= -1;
                }
                
                my ($dateBegin,$dateEnd) = _getDates($date);
                my $serviceID = $self->getServiceID(lc ($serviceName)) || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $serviceName };  
                
                # If we don't have an entry in either the service list or service mapping
                # AND there's a wide character, let's just set it to the unknown service.
                # There seems to be an unending number of service names that we can't decipher...
                if (!$serviceID && $serviceName =~ /â/)
                {
                   $serviceID = Client::Service::DSP_UNKNOWN; 
                   print STDERR "Mapped service " . $line->[$data->{service}] . " to Unknown service - line $linenum\n";
                }          
                
                unless (defined $dateBegin && defined $dateEnd) {
                    print STDERR "Couldn't get dates from: ". $lines->[$data->{date_begin}] . " line $linenum\n";
                    $self->errstr("couldn't get dates from: ".$lines->[$offsets->{data_begin}]);
                    return undef;
                }
                unless ($format ne "") {
                    print STDERR "Unknown format: " . $line->[$data->{format_type}] . " line $linenum\n";
                    $self->errstr("Unknown format: " . $line->[$data->{format_type}]);
                }
                unless ($prodType ne "") {
                    print STDERR "Unknown product type: " . $line->[$data->{product}] . " line $linenum\n";
                    $self->errstr("Unknown product type: " . $line->[$data->{product}]);
                }   
                unless ($serviceID ne "") {
                    print STDERR "Unknown service: " . $line->[$data->{service}] . " line $linenum\n";
                    $self->errstr("Unknown service: " . $line->[$data->{service}]);
                }    
                unless ($country ne "") {
                    print STDERR "Unknown country: " . $line->[$data->{country}] . " line $linenum\n";
                    $self->errstr("Unknown country: " . $line->[$data->{country}]);
                }                                             
                
                my $sale = RPS::Import::SaleRec->new();

                $sale->mediaType($mediaType);
                $sale->productType($prodType);
                $sale->dateBegin($dateBegin);
                $sale->dateEnd($dateEnd);
                $sale->artistName($artist);
                $sale->albumName($album) if($album ne "");
                $sale->trackName($track) if($track ne "" && $prodType eq RPS::File::Sale::TYPE_TRACK);
                $sale->isrc(($isrc)) if($isrc ne "");
                $sale->upc(($upc)) if($upc ne "");
                $sale->formatType($format);
                $sale->units($units);
                $sale->price($price);
                $sale->countryCode($country);
                $sale->currencyCode($currency);
                $sale->serviceID($serviceID);
                $sale->lineNum($linenum);

                $self->_insertSale(sale => $sale);
            } 
            #else { print STDERR "skip sh: ".$sheet_names->[$sheet_count] . ": l: " . $linenum . " - u:".$units." p:".$price." a:".$artist." t:".$track." a:".$album." f:".$format."\n"; }
            $linenum++;
        }
        $sheet_count++;
    }
	return $linenum;
}

#
# Private methods
#


sub _getDates
{
	my $passed_date = shift;
    $passed_date =~ m/(\d{4}) (\d{2}) \((\D{3})\)/;
    my $year = $1;
    my $fiscalMonth = $2;
    my $saleMonth = $3;
    # Translate month abbreviation to a number
    my %months = (
		jan    => 1,
        feb    => 2,
        mar    => 3,
        apr    => 4,
        may    => 5,
        jun    => 6,
        jul    => 7,
        aug    => 8,
        sep    => 9,
        oct    => 10,
        nov    => 11,
        dec    => 12,
	);    
    
	if( $saleMonth ) {
	    $saleMonth = $months{lc($saleMonth)};  
	
    	if ($saleMonth > $fiscalMonth)
    	{
    	    $year--;   
    	}
        
        my $dateBegin = sprintf("%04d-%02d-%02d", $year, $saleMonth, 1);
        my $dateEnd   = sprintf("%04d-%02d-%02d", $year, $saleMonth, Days_in_Month($year, $saleMonth));
        return ($dateBegin, $dateEnd);
    }
    
    return undef;
}

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