package RPS::Import::7Digital::v9;

use strict;

use Date::Calc qw(Days_in_Month);

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

use lib '/app/tools/common/lib';
use Common::Consts qw(%COUNTRY_CODE);

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

my %service_map = (
);

my %field_map = (
    9 => {
        artist         => 10,
        album          => 11,
        track          => 11,
        isrc           => 3,
        upc            => 2,
        label          => 12,
        country        => 15,
        period_begin   => 0,
        period_end     => 1,
        product_type   => 8,
        catalog_number => 4,
        units          => 5,
        price          => 18,
        service_name   => 9,
    },
);

#
# public methods
#

sub _importLines
{
    my $self = shift;
    my %args = @_;
    my $lines = $args{lines};
    return undef unless ($lines);
    my $version = $self->_version();
    my $offsets = $field_map{$version};
    #my $fileName = $args{OrigFileName}; # cmd-line testing
    my $fileName = $args{file}->OrigFileName();

    my $linenum = 1;


    foreach my $line (@$lines)
    {
        my ($album, $artist, $country, $currencyCode, $dateBegin, $dateEnd,
            $format, $isrc, $label, $price, $prodType, $serviceName,
            $track, $units, $upc );

        $artist        = $line->[$offsets->{artist}];
        $track         = $line->[$offsets->{track}];
        $album         = $line->[$offsets->{album}];
        $isrc          = $line->[$offsets->{isrc}];
        $upc           = $line->[$offsets->{upc}];
        $price         = $line->[$offsets->{price}];
        $currencyCode = 'GBP';
        $format        = RPS::File::Sale::FORMAT_DOWNLOAD;
        $units         = $line->[$offsets->{units}];
        $label         = $line->[$offsets->{label}];

        if ( exists $line->[$offsets->{country}] ) {
            $country = $COUNTRY_CODE{lc($line->[$offsets->{country}])};
        } else {
            $self->errstr("Missing territory in line:".$linenum. " or ".$fileName);
            return undef;
        }

        $serviceName = $line->[ $offsets->{service_name} ];
        my $serviceID;

        if($serviceName){

            $serviceID = $self->getServiceID($serviceName) || $service_map{$serviceName};

            my $strippedServiceName = $serviceName =~ s/\s/_/g;

            $serviceID = $self->getServiceID($strippedServiceName) ||
                         $service_map{$strippedServiceName} if($serviceID eq "");
        }

        if ( $line->[$offsets->{product_type}] =~ /^a/i ) {

            $prodType = RPS::File::Sale::TYPE_ALBUM;
            undef $track;

            if ( !$upc ) {
                $self->errstr("Album product without UPC in l:".$linenum);
                return undef;
            }

            if ( !$album ) {
                $self->errstr("Album title required in l:".$linenum);
                return undef;
            }

        }  elsif ( $line->[$offsets->{product_type}] =~ /^s/i ) {

            $prodType = RPS::File::Sale::TYPE_TRACK;
            undef $album;

            if ( !$track ) {
                $self->errstr("Track title required in l:".$linenum);
                return undef;
            }

            if ( !$isrc ) {
                $self->errstr("ISRC required in in line:".$linenum);
                return undef;
            }

        }

        if(($artist ne "Artist Name")&&($units>0)&&($track ne "Release Title")) {

            ($dateBegin) = _getDates( $line->[$offsets->{period_begin}] );
            ($dateEnd)   = _getDates( $line->[$offsets->{period_end}] );

            if ( !$prodType ) {
                $self->errstr("Illegal product type (expected S or A) in line:".$linenum);
                return undef;
            }

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

            $sale->productType($prodType);
            $sale->upc($upc) if ( $upc and '' ne $upc );;
            $sale->isrc($isrc) if ($isrc and '' ne $isrc );
            $sale->trackName($track) if ($prodType eq RPS::File::Sale::TYPE_TRACK );
            $sale->albumName($album) if ($prodType eq RPS::File::Sale::TYPE_ALBUM );
            $sale->formatType($format);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->artistName($artist);
            $sale->labelName($label);
            $sale->price(sprintf("%.8f",($price/$units)));
            $sale->units($units);
            $sale->currencyCode($currencyCode);
            $sale->countryCode($country);
            $sale->serviceID($serviceID) if ( $serviceName );
            $sale->lineNum($linenum);

            #$args{dumper}($sale); ## for cmd-line testing
            $self->_insertSale(sale => $sale);
        }
        #else { print STDERR "skip: ". join(',', @$line) . "\n"; }
        $linenum++;
    }
    return $linenum;
}

#
# Private methods
#

sub _getDates
{
    my $d = shift;
    my ($year, $month, $day);

    if($d =~ m/(\d+)\D(\d+)\D(\d{4})/) {
        $year = $3;
        $day = $2;
        $month = $1;
    }
    elsif($d =~ m/(\d{4})\D(\d+)\D(\d+)/) {
        $year = $1;
        $month = $2;
        $day = $3;
    }
    return undef unless ($year ne "" && $month ne "");
    return (
        sprintf("%04d-%02d-%02d", $year, $month, $day)
    );
}

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