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