package RPS::Import::WMG::SprintMultiFormat;

use strict;

use lib '/app/tools/common/lib';
use Common::Util qw(normalize_isrc);

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

use lib '/app/tools/rps/lib';
use RPS::File::Sale;
use RPS::Import::WMG::Util;
use base 'RPS::Import::WMG::SprintBase';

my %field_map =
(
    12 => {
        date        => 3,
        cli_prod_id => 0,
        svc_prod_id => 4,
        description => 5,
        isrc        => 6,
        units       => 8,
        retail      => 9,
        rate        => 10,
        price       => 11,
    },
);

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

    my $lines = $args{lines};
    my $fileObj = $args{file};
    my $fileName = $fileObj->OrigFileName;
    #my $fileName = $args{OrigFileName}; # for cmd-line testing
    my $version = $self->_version;
    my $offsets = $field_map{$version};

    $self->_setDateRangeFromNumeric($lines, $offsets->{date});

    my ($billTo, $sellTo) = RPS::Import::WMG::Util::getWirelessInfo($self->{fileServiceID});
    unless ($billTo && $sellTo)
    {
        $self->warning();
        print STDERR "unknown billto/sellto mapping: $self->{fileServiceID}\n";
    }

    $fileObj->Atomic(1);
    $fileObj->Save();

    my $prodType = RPS::File::Sale::TYPE_TRACK;
    my %errors = ();
    my $linenum;

    for (my $i = 1; $i < scalar @$lines; $i++)
    {
        $linenum = $i + 1;
        my $line = $lines->[$i];
        my $cliProdID = $line->[$offsets->{cli_prod_id}];
        my $svcProdID   = $line->[$offsets->{svc_prod_id}];
        next if ($cliProdID =~ m/partner/i || !$svcProdID || $svcProdID =~ m/\s+Total$/);

        my $formatName = $self->_decodeSprintFormatID($cliProdID);
        my $format = RPS::Import::WMG::Util::getWirelessFormatTypeID($formatName);
        unless ($formatName && $format)
        {
            unless ($errors{$cliProdID})
            {
                print STDERR "unknown format for '$cliProdID'\n";
                $errors{$cliProdID} = 1;
            }
            next;
        }

        my ($formatMatch) = $formatName =~ /^(\w)/;
        my $priceType = '';

        unless ($priceType = RPS::Import::WMG::Util::getWirelessPriceType($formatName))
        {
            unless ($errors{$formatName})
            {
                $self->warning();
                print STDERR "unknown format mapping: $formatName\n";
                $errors{$formatName} = 1;
            }
        }

        my ($track, $artist) = $self->_parseDescription($line->[$offsets->{description}], $formatMatch);
        my $isrc        = defined $offsets->{isrc} ? normalize_isrc($line->[$offsets->{isrc}]) : '';
        my $units       = $self->numeric($line->[$offsets->{units}]);
        my $retail      = $self->numeric($line->[$offsets->{retail}]);
        my $ppdRate     = $self->numeric($line->[$offsets->{rate}]);
        my $price       = $self->numeric($line->[$offsets->{price}]);

        if ($track && $units && $price =~ m/\d/)
        {
            my ($dateBegin,$dateEnd) = $self->_getDatesFromNumeric($line->[$offsets->{date}]);
            unless ($dateBegin && $dateEnd)
            {
                $self->errstr("couldn't get dates");
                return undef;
            }
            my $origDate = RPS::Import::WMG::SprintBase::numericToDate($line->[$offsets->{date}]);

            $retail /= $units;
            $price /= $units;

            $price *= -1 if($fileName =~ /refund/i && $price < 0);
            $units *= -1 if($fileName =~ /refund/i && $units > 0);

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

            $sale->productType($prodType);
            $sale->formatType($format);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->serviceProductID($svcProdID);
            $sale->clientProductID($cliProdID);
            $sale->artistName($artist);
            $sale->trackName($track);
            $sale->isrc($isrc);
            $sale->units($units);
            $sale->price($price);
            $sale->retail($retail);
            $sale->wholesaleRate($ppdRate);
            $sale->payoutType($origDate); # had to stick this somewhere
            $sale->priceType($priceType);
            $sale->lineNum($linenum);

            #$args{dumper}($sale); # for cmd-line testing
            $self->_insertSale(sale => $sale);
        }#else { print STDERR "skip u: $units p: $price t: $track a: $artist ($linenum)\n" }
        $linenum++;
    }

    return $linenum;
}

#
# Private methods
#

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