package RPS:Import::FontanaYearlyDigital;

use strict;

use Date::Calc qw(Days_in_Month);

use lib '/app/tools/common/lib';
use Common::Util;
use Common::Consts;

use lib '/app/tools/data_classes/lib';

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

my %field_map = (
    3 => {
        format              => 1,
        service             => 2,
        sale_unit           => 4,
        album_artist        => 5,
        album               => 6,
        track_artist        => 7,
        track               => 8,
    },
);

my %delivery_formats = (
    'AD SUPPORTED STREAMS'              => RPS::File::Sale::FORMAT_STREAM,
    'KIOSK'                             => RPS::File::Sale::FORMAT_DOWNLOAD,
    'OTA PERMANENT DOWNLOADS'           => RPS::File::Sale::FORMAT_DOWNLOAD,
    'PERMANENT DOWNLOADS'               => RPS::File::Sale::FORMAT_DOWNLOAD,
    'PORTABLE SUB CLIENT PLAYS'         => RPS::File::Sale::FORMAT_STREAM,
    'PORTABLE SUB STREAMS'              => RPS::File::Sale::FORMAT_STREAM,
    'PROGRAMMED STREAMING'              => RPS::File::Sale::FORMAT_STREAM,
    'PORTABLE SUB DEVICE PLAYS'         => RPS::File::Sale::FORMAT_STREAM,
    'STREAMS'                           => RPS::File::Sale::FORMAT_STREAM,
    'TETHERED/CONDITIONAL DOWNLOADS'    => RPS::File::Sale::FORMAT_TETHERED,
    'VIDEO DOWNLOADS'                   => RPS::File::Sale::FORMAT_DOWNLOAD,
);

my %service_map = (
    'apple digital sales'       => Client::Service::DSP_ITUNES,
    'listen/rhapsody'           => Client::Service::DSP_REAL,
    'full audio/musicnow'       => Client::Service::DSP_MUSICNOW,
    'nextradio solutions'       => Client::Service::DSP_NEXTRADIO,
    'broadband instruments corp.' => Client::Service::DSP_SLACKERINC,
);

#
# public methods
#

sub _importLines
{
    my $self = shift;
    my %args = @_;
    my $lines = $args{lines};
    return undef unless ($lines);
    my $version = $args{file}->VersionNum();
    my $fileName = $args{file}->OrigFileName();

    my $format = RPS::File::Sale::FORMAT_DOWNLOAD;
    my $linenum = 1;
    my $was_album_title = 0;
    my (%errors,@dates,$passed_format,$album,$dateBegin,$dateEnd,$total_columns,$fee_percentage);
    my $country = "US";
    my $start_column = "";
    
    foreach my $line (@$lines)
    {
        my @cols = @$line;
        if($linenum==1) {
            for(my $x=0;$x<@cols;$x++) {
                if($line->[$x] ne "") {
                    $start_column = $x if($start_column eq "");
                    $dates[$x]{date} = $cols[$x];
                }
            }
        }
        if($linenum>2) {
            my $artist      = $line->[$field_map{$version}{track_artist}];
            $artist         = $line->[$field_map{$version}{album_artist}] if ($line->[$field_map{$version}{track_artist}] eq "");
            my $title       = $line->[$field_map{$version}{track}];
            my $album       = $line->[$field_map{$version}{album}];
            my $sale_type   = $line->[$field_map{$version}{sale_unit}];
            my $raw_format  = uc $line->[$field_map{$version}{format}];
            $raw_format     =~ s/\s\(.*$//;
            my $format      = $delivery_formats{$raw_format}; 
            my $serviceName = lc $line->[$field_map{$version}{service}];
            $serviceName =~ s/\s\(.*$//;
            my $serviceID   = $self->getServiceID($serviceName)|| $service_map{$serviceName};;
        
            if($artist && $sale_type && $format) {
                unless ($serviceID) {
                    print STDERR "Could not find service: " . $serviceName . "\n";
                    $self->errstr("Could not find service: " . $serviceName);
                }
                #print STDERR "i->l:".$linenum;
                for(my $y=$start_column;$y<@cols;$y++) {
                    $line->[$y] =~ s/\s//g;
                    $line->[$y] = "" if($line->[$y]==0);
                    if($line->[$y] ne "" && $line->[$y+1] ne "") {
                        #print STDERR " c:".$y." u:".$line->[$y]." r:".$line->[$y+1];
                        my ($dateBegin,$dateEnd) = _get_dates($dates[$y]{date});
                        unless ($dateBegin && $dateEnd) {
                            print STDERR "Could not find dates from: " . $dates[$y]{date}. "\n";
                            $self->errstr("Could not find dates from: " . $dates[$y]{date});
                            return undef;
                        }

                        my $units = $line->[$y];
                        my $price = $line->[$y+1]/$units;
                        $price *= -1 if($price<0);
                        my $sale = RPS::Import::SaleRec->new();
                        $sale->productType(RPS::File::Sale::TYPE_TRACK) if ($sale_type =~ /track/i);
                        $sale->productType(RPS::File::Sale::TYPE_ALBUM) if ($sale_type =~ /album/i);
                        $sale->trackName($title) if ($sale_type =~ /track/i);
                        $sale->albumName($album) if ($album ne "");
                        $sale->serviceID($serviceID);
                        $sale->formatType($format);
                        $sale->dateBegin($dateBegin);
                        $sale->dateEnd($dateEnd);
                        $sale->artistName($artist);
                        $sale->price($price);
                        $sale->units($units);
                        $sale->currencyCode('USD'); 
                        $sale->countryCode($country);
                        $sale->lineNum($linenum);
                        #$args{dumper}($sale); ## for cmd-line testing
                        $self->_insertSale(sale => $sale);
                        #print STDERR "Inserting l:".$linenum." col:".$y." a:".$artist." t:".$title." f:".$format." p:".$price." u:".$units." t:".$sale_type." d:".$dates[$y]{date}."\n";
                    }
                    #else { print STDERR "skip1 l:".$linenum." col:".$y." a:".$artist." t:".$title." f:".$format." t:".$sale_type." d:".$dates[$y]{date}."\n"; }
                    $y++;
                }
                #print STDERR "\n";
            }
            #else { print STDERR "skip2 l:".$linenum." a:".$artist." t:".$sale_type." f:".$format." d:".$dateBegin." d:".$dateEnd."\n"; }
        }
        $linenum++;
    }
    return $linenum;
}

#
# Private methods
#

sub _get_dates
{
    my $passed_date = shift;
    $passed_date =~ m/(\d{4})\D(\d+)\D(\d+)/;
    my $month = $2;
    my $year = $1;
    return undef if (!$month||!$year);
    return (
        sprintf("%04d-%02d-01", $year, $month), 
        sprintf("%04d-%02d-%02d", $year, $month, Days_in_Month($year, $month))
    );
}

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