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