package RPS::Import::E1Distribution::v1;

use strict;

use Date::Calc qw(Days_in_Month);

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

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

my %field_map = (
    1 => {
        label           => 1, # B
        service         => 1, # B
        sale_date       => 2, # C
        isrc            => 3, # D
        upc             => 3, # D
        title           => 5, # F - "Album / Track Title"
        artist          => 6, # G - "Album / Track Artist"
        format          => 7, # H - "Format"
        units           => 8, # I - "Units"
        price           => 9, # J - "Dollars"
        country         => 0, # A - (line > 4)
    },
);

my %productFormatMap = (
    'album burn' => {
       format => RPS::File::Sale::FORMAT_DOWNLOAD,
       product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'album download' => {
       format => RPS::File::Sale::FORMAT_DOWNLOAD,
       product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'album download subscription' => {
       format => RPS::File::Sale::FORMAT_VPD,
       product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'album download-subscription' => {
       format => RPS::File::Sale::FORMAT_VPD,
       product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'album high quality playlist/album' => {
       format => RPS::File::Sale::FORMAT_DOWNLOADPREMIUM,
       product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'album teth download' => {
       format => RPS::File::Sale::FORMAT_TETHERED,
       product_type => RPS::File::Sale::TYPE_ALBUM,
    },
    'track audio/video stream' => {
       format => RPS::File::Sale::FORMAT_STREAM,
       product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track burn' => {
       format => RPS::File::Sale::FORMAT_DOWNLOAD,
       product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track download subscription' => {
       format => RPS::File::Sale::FORMAT_VPD,
       product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track download-subscription' => {
       format => RPS::File::Sale::FORMAT_VPD,
       product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track download' => {
       format => RPS::File::Sale::FORMAT_DOWNLOAD,
       product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track high quality song' => {
       format => RPS::File::Sale::FORMAT_DOWNLOADPREMIUM,
       product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track stream' => {
       format => RPS::File::Sale::FORMAT_STREAM,
       product_type => RPS::File::Sale::TYPE_TRACK,
    },
    'track stream cloud' => {
       format => RPS::File::Sale::FORMAT_STREAM,
       product_type => RPS::File::Sale::TYPE_TRACK,
    },

);


#
# 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{file}->OrigFileName();

    my $linenum = 1;

    my $dateBegin;
    my $dateEnd;
    my $label;


my %badFormats;
    foreach my $line (@$lines)
    {

        if ( $linenum == 1 )
        {
            my $_date = $line->[$offsets->{sale_date}];
            ($dateBegin,$dateEnd) = _get_dates( $line->[$offsets->{sale_date}] );
            #print STDERR "DEBUG: date($_date) ==> begin($dateBegin) end($dateEnd)\n";

            $label = $line->[$offsets->{label}];
            $label =~ s/Label: //;
        }

        my $currency_code = "USD";

        my $_title      = $line->[$offsets->{title}]; # album or track
        my $_isrcUPC    = $line->[$offsets->{isrc}];  # upc or isrc
        my $albumName;
        my $trackName;
        my $isrc;
        my $upc;

        my $price       = $line->[$offsets->{price}];
        $price =~ s/\$//;

        my $country     = $line->[$offsets->{country}];
        my $format      = lc $line->[$offsets->{format}];

        my $units       = $line->[$offsets->{units}];
        $units =~ s/,//;

        my $artist      = $line->[$offsets->{artist}];
        my $serviceName = $line->[$offsets->{service}];

        if ( !$serviceName || '' eq $serviceName )
        {
            $linenum++;
            next;
        }


        my $serviceID = $self->getServiceID( $serviceName ) || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $serviceName };


        my $productType = $productFormatMap{$format}{product_type};
        my $formatType  = $productFormatMap{$format}{format};

        if ( $productType eq RPS::File::Sale::TYPE_TRACK )
        {
            $trackName = $_title;

            # Per the spec, the track name will be prefixed with "Track: # -(space)".

            my($_prefix, $_name) = split(" - ", $_title);
            $trackName = $_name;
            $isrc      = $_isrcUPC;
        }
        elsif( $productType eq RPS::File::Sale::TYPE_ALBUM )
        {
            $albumName = $_title;
            $upc       = $_isrcUPC;
        }
        else
        {
            if( '' ne $format && $linenum > 2 )  # skip blank format and the header
            {
                $self->errstr("Unable to get format/product type from '$format'");
                $badFormats{$format} = $format;
            }
        }


        if( $units == 0 )
        {
            $units = 1 if( $price > 0 );
            $units = -1 if( $price < 0 );
        }
        elsif( $units < 0 )
        {
            $units = abs($units) if( $price > 0 ); # match sign of revenue
        }
        elsif( $units > 0 )
        {
            $units *= -1 if( $price < 0 ); # match sign of revenue
        }

        if( $serviceName ne 'Digital Provider' && $units && ($albumName || $trackName) ) {

            unless($dateBegin ne "" && $dateEnd ne "") {
                $self->errstr("Couldn't get dates from: ".$line->[$offsets->{sale_date}] . " l:$linenum" );
                print STDERR "Couldn't get dates from:".$line->[$offsets->{sale_date}] . " l:$linenum\n";
            }

            unless( $serviceID ) {
                $self->errstr("l:$linenum, Unrecognized service '$serviceName'" );
                print STDERR "l:$linenum: Unrecognized service '$serviceName'\n";
            }

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

            my $unitPrice = $price / $units;
            $unitPrice = 0 if($unitPrice == -0);

            $sale->serviceID($serviceID);
            $sale->productType($productType);
            $sale->upc($upc) if ( $upc );
            $sale->isrc($isrc) if ( $isrc );
            $sale->trackName($trackName) if ( $trackName );
            $sale->albumName($albumName) if ( $albumName );
            $sale->formatType($formatType);

            #$sale->serviceProductID($service_product);

            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->artistName($artist);
            $sale->labelName($label);
            $sale->price(sprintf("%.8f", $unitPrice));
            $sale->units($units);
            $sale->currencyCode($currency_code);
            $sale->countryCode($country);
            $sale->lineNum($linenum);

            $self->_insertSale(sale => $sale);
        }
        #else { print STDERR "skip: album($albumName) track($trackName) u($units) --> ". join(',', @$line) . "\n"; }
        $linenum++;
    }
    return $linenum;
}

#
# Private methods
#

sub _get_dates
{
    my $dateString = shift;

    my $startYear;
    my $startMonth;
    my $endYear;
    my $endMonth;

    if( $dateString =~ m/Fiscal Period: (\d{4})(\d{2}) thru: (\d{4})(\d{2})/i ) {
        $startYear  = $1;
        $startMonth = $2;
        $endYear    = $3;
        $endMonth   = $4;
    }
    else
    {
        return undef;
    }

    return (
        sprintf("%04d-%02d-01", $startYear, $startMonth),
        sprintf("%04d-%02d-%02d", $endYear, $endMonth, Days_in_Month($endYear, $endMonth))
    );
}

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