package RPS::Import::PIASDigital;

use strict;

use Date::Calc qw(Days_in_Month Decode_Month);

use lib '/app/tools/common/lib';
#use Common::Util;
use Common::Util qw(normalize_date normalize_isrc);
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 %field_map = (
    1 =>
    {
        date           => 0,
        artist         => 1,
        title          => 2,
        upc            => 3,
        client_prod_id => 4,
        isrc           => 5,
        format         => 6,
        country        => 7,
        service        => 8,
        units          => 9,
        revenue        => 15,  
        currency_code  => 16,   
    },
    2 => {
        date           => 5,
        artist         => 0,
        title          => 1,
        upc            => 3,
        #client_prod_id => ,
        isrc           => 2,
        format         => 5,
        country        => 4,
        service        => 6,
        units          => 7,
        revenue        => 13,
        currency_code  => 1,
    },
);

my %formats =
('album'           => [RPS::File::Sale::FORMAT_DOWNLOAD, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_ALBUM],
                   
 'digital album'   => [RPS::File::Sale::FORMAT_DOWNLOAD, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_ALBUM],      
                   
 'digital track'   => [RPS::File::Sale::FORMAT_STREAM,
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_TRACK],
                   
 'digital ep'   => [RPS::File::Sale::FORMAT_DOWNLOAD, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_ALBUM],        

 'full album download' => [RPS::File::Sale::FORMAT_DOWNLOAD, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_ALBUM],                                                 
                   
 'playcounts'      => [RPS::File::Sale::FORMAT_TETHERED, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_TRACK],
                   
 'real_audio_tone' => [RPS::File::Sale::FORMAT_RINGTONE, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_TRACK],
                   
 'single'          => [RPS::File::Sale::FORMAT_DOWNLOAD, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_ALBUM],
                   
 'digital single'  => [RPS::File::Sale::FORMAT_DOWNLOAD, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_ALBUM],
                   
 'stream'          => [RPS::File::Sale::FORMAT_STREAM, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_TRACK],
                   
 'track'           => [RPS::File::Sale::FORMAT_DOWNLOAD, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_TRACK],
                   
 'video_long_form' => [RPS::File::Sale::FORMAT_DOWNLOAD, # was FORMAT_VIDEO (FB1324)
                   RPS::DB::Item::MediaType::kMediaTypeVideo,
                   RPS::File::Sale::TYPE_TRACK],
                   
 'video_short_form'=> [RPS::File::Sale::FORMAT_DOWNLOAD, # was FORMAT_VIDEO (FB1324)
                   RPS::DB::Item::MediaType::kMediaTypeVideo,
                   RPS::File::Sale::TYPE_TRACK], 
                   
 'video shortform'=> [RPS::File::Sale::FORMAT_DOWNLOAD, # was FORMAT_VIDEO (FB1324)
                   RPS::DB::Item::MediaType::kMediaTypeVideo,
                   RPS::File::Sale::TYPE_TRACK],                            

# digital download can be album or track
 'digital download' => [RPS::File::Sale::FORMAT_DOWNLOAD, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_ALBUM],

 'mobile audio/video stream' => [RPS::File::Sale::FORMAT_STREAM, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_TRACK], # FB13054
 'full audio track download' => [RPS::File::Sale::FORMAT_DOWNLOAD, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_TRACK], # FB13054
 'real audio tones' => [RPS::File::Sale::FORMAT_RINGTONE, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_TRACK], # FB13054
 'ring back tone music' => [RPS::File::Sale::FORMAT_RINGTONE, 
                   RPS::DB::Item::MediaType::kMediaTypeAudio,
                   RPS::File::Sale::TYPE_TRACK], # FB13054
 'full video download' => [RPS::File::Sale::FORMAT_DOWNLOAD, 
                   RPS::DB::Item::MediaType::kMediaTypeVideo,
                   RPS::File::Sale::TYPE_TRACK], # FB13054
                   
                   
                   
);

my %service_hash =
("24/7 musicshop" => Client::Service::DSP_24_7_MUSICSHOP,
 "7 digital"      => Client::Service::DSP_7DIGITAL,
 "at&t"           => Client::Service::DSP_ATT,
 "audiojelly"     => Client::Service::DSP_AUDIOJELLY,
 "tune tribe"     => Client::Service::DSP_TUNETRIBE,
 "virginmega"     => Client::Service::DSP_VIRGINMEGA,
 "last.fm(settlement)" => Client::Service::DSP_LASTFM);

#public methods

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

    my $lines = $args{lines};
    my $version = $args{file}->VersionNum();
    my $fileName = $args{file}->OrigFileName();
    my @sheets = @{ $args{sheets} };

    return undef unless ($lines);

    my $linenum = 1;
            
    my $offsets = $field_map{$version};
    my %errors = ();
       
    my $currencyCode;
        
    my($gDateBegin, $gDateEnd);

    foreach my $line(@$lines){
        my $f_currency = $line->[$offsets->{currency_code}];
        my $f_artist = $line->[$offsets->{artist}];

        my $f_date = $line->[$offsets->{date}];

        if ($f_date =~ m/FOR PERIOD (september|october|november|december|january|february|march|april|may|june|july|august) (\d{4})/i)
        {
            my $month = Decode_Month($1);
            my $year  = $2;
            $gDateBegin = sprintf("%04d-%02d-%02d", $year, $month, 1);
            $gDateEnd   = sprintf("%04d-%02d-%02d", $year, $month, Days_in_Month($year, $month));
        }

        if(!$currencyCode &&
           (($f_artist && $f_artist =~ m/Currency:/i) || ($f_date && $f_date =~ m/Grand-totals/i)) &&
           $f_currency =~ /([A-Z]{3})/)
        {
            $currencyCode = $1;
        }
    }
    
    if(!$currencyCode){
        $self->errstr("couldn't get currency code from grand total");
        print STDERR "couldn't get currency code from grand total";
        return undef;
    }
    
    foreach my $lines(@sheets)
    {
        
        $linenum = 1;
        
        foreach my $line(@$lines)
        {
            my $date = $line->[$offsets->{date}];
            my $artist = $line->[$offsets->{artist}];
            my $title = $line->[$offsets->{title}];
            my $upc = $line->[$offsets->{upc}];
            my $isrc = $line->[$offsets->{isrc}];
            my $f_format = lc $line->[$offsets->{format}];
            my $f_country = lc $line->[$offsets->{country}];
            my $f_service = lc $line->[$offsets->{service}];
            my $units = $line->[$offsets->{units}];
            my $revenue = $line->[$offsets->{revenue}];

            my $clientProductID = (exists $offsets->{client_prod_id}) ?  $line->[$offsets->{client_prod_id}] : undef;

            my $productType;
            my $mediaType;
            my $format;
            
            $f_service =~ s/\s+-.*//;
            
            my $service = $self->getServiceID($f_service) || $service_hash{$f_service} || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $f_service };
                      
            $upc =~ s/[^0-9]//g;                      
            
            my ($dateBegin, $dateEnd);
            if ( !$gDateBegin && !$gDateBegin )
            {
                $date = _normalizeDate($date);
                ($dateBegin, $dateEnd) = $self->_getDates(date_begin=>$date, type=>"iso");
            }
            else
            {
                $dateBegin = $gDateBegin;
                $dateEnd   = $gDateEnd;
            }

            if ( $units && $units =~ m/\(/ ) {
                $units =~ s/\(//;
                $units =~ s/\)//;
                $units *= -1 if ( $units > 0 );
            }

            if($artist && $title && $units =~ /\d+/ && $revenue =~ /\d+/) 
            {
                my $country;
                if ( $f_country && '' ne $f_country && $f_country !~ m/territory/i )
                {
                    my $obj = Common::Country->Get( $f_country );
                    if ( !$obj )
                    {
                        $self->errstr("Unknown country '$f_country' in line number: $linenum");
                        return undef;
                    }
                    else
                    {
                        $country = $obj->alpha2();
                    }
                }
            
                unless ($dateBegin && $dateEnd) {
                    $self->errstr("couldn't get dates, line number: $linenum");
                    return undef;
                }
                
                unless($formats{$f_format}){
                    $self->errstr("Unknown format '$f_format' at line number: $linenum");
                    return undef;
                }
                
                unless($service){
                    $self->errstr("Unknown service '$f_service' at line number: $linenum");
                    return undef;
                }               
                
                ($format, $mediaType, $productType) =
                    @{$formats{$f_format}};

                my $price = $revenue / $units if($units != 0);  
                $price *= -1 if ( $price < 0 );
            
                my $sale = RPS::Import::SaleRec->new();
                $sale->productType($productType);
                $sale->formatType($format);
                $sale->mediaType($mediaType);
                $sale->artistName($artist);
                $sale->albumName($title) if( $productType eq RPS::File::Sale::TYPE_ALBUM );
                $sale->trackName($title) if( $productType eq RPS::File::Sale::TYPE_TRACK );
                $sale->upc($upc) if($upc && $upc =~ /^[0-9]+$/);
                $sale->isrc($isrc) if($isrc && $isrc =~ /^[A-Z][A-Z]/);
                $sale->units($units);
                $sale->price($price);
                $sale->currencyCode($currencyCode);
                $sale->countryCode($country);
                $sale->clientProductID($clientProductID) if($clientProductID && $clientProductID !~ /N\/A/);
                $sale->serviceID($service);
                $sale->dateBegin($dateBegin);
                $sale->dateEnd($dateEnd);
                $sale->lineNum($linenum);
            
                #$args{dumper}($sale);  ## for cmd-line testing
                $self->_insertSale(sale => $sale);
            }
        
            $linenum++;
        }
    }
    

    return $linenum;
}
sub _normalizeDate {
    my($dt) = @_;
    my $date = $dt;
    if ( $dt =~ m/^\d{5}$/ ) {
        $date = Spreadsheet::ParseExcel::Utility::ExcelFmt( "yyyy-mm-dd", $dt );
    }
    return $date;
}

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