package RPS::Import::WMG::WarnerPhysical;

use strict;

use Date::Calc qw(Days_in_Month Decode_Month);

use lib '/app/tools/common/lib';
use Common::Consts qw(%CURRENCY_TO_COUNTRY);
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 => {
        date_begin      => 0,
        service_name    => 1,
        product_type    => 5,
        service_id      => 7,
        artist          => 9,
        album           => 10,
        gross_units     => 12,
        returns         => 13,
        net_units       => 14,
        gross_revenue   => 15,
        returns_revenue => 16,
        net_revenue     => 17,
    },
);

my %productTypes = (
    CD => RPS::File::Sale::TYPE_CD,
    BD => RPS::File::Sale::TYPE_BLURAY,
    DV => RPS::File::Sale::TYPE_DVD,
    A  => RPS::File::Sale::TYPE_CD,
    CX => RPS::File::Sale::TYPE_DVD_CD_SET,
    MS => RPS::File::Sale::TYPE_LP,
);

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

    my $lines    = $args{lines};
    my $version  = $args{file}->VersionNum();
    my $fileName = $args{file}->OrigFileName();
    my $fileObj  = $args{file};
    $fileObj->Physical(1);
    my @sheets = @{ $args{sheets} };

    return undef unless ($lines);

    my $linenum = 1;

    my $offsets = $field_map{$version};
    my %errors  = ();

    my ( $dateBegin, $dateEnd );

    foreach my $line (@$lines) {
        my $service_product_id = $line->[ $offsets->{service_id} ];
        my $serviceName        = $line->[ $offsets->{service_name} ];
        my $artist             = $line->[ $offsets->{artist} ];
        my $album              = $line->[ $offsets->{album} ];
        my $grossUnits         = $line->[ $offsets->{gross_units} ];
        my $grossRevenue       = $line->[ $offsets->{gross_revenue} ];
        my $netRevenue         = $line->[ $offsets->{net_revenue} ];
        my $f_date_begin       = $line->[ $offsets->{date_begin} ];
        my $config             = uc $line->[ $offsets->{product_type} ];
        my $type               = $productTypes{$config} || '';

        my $returns        = $line->[ $offsets->{returns} ];
        my $returnsRevenue = $line->[ $offsets->{returns_revenue} ];

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

        # Now we need to strip out any formatting from numerical fields
        $grossUnits =~ s/[\(\),-]//g     if ( defined $grossUnits );
        $grossRevenue =~ s/[\(\),]//g    if ( defined $grossRevenue );
        $netRevenue =~ s/[\(\),]//g      if ( defined $netRevenue );
        $returns =~ s/[\(\),-]//g        if ( defined $returns );
        $returnsRevenue =~ s/[\(\),-]//g if ( defined $returnsRevenue );

        if ( $netRevenue eq '-0' ) {
            $netRevenue = 0;
        }

        if ( $grossRevenue eq '-0' ) {
            $grossRevenue = 0;
        }

        if ( $grossRevenue < 0 ) {
            $returnsRevenue += ( $grossRevenue * -1 );
            $grossRevenue = 0;
        }

        my $currency = 'USD';
        my $country  = 'US';
        my $channel  = RPS::File::Sale::CHANNEL_RETAIL;
        my $plevel   = RPS::File::Sale::PLEVEL_FULL;

        if (   $service_product_id
            && $artist
            && $album
            && $f_date_begin
            && $f_date_begin ne 'MONTH'
            && ( $grossUnits || $returns ) ) {
            ( $dateBegin, $dateEnd ) = $self->_getDates( date_begin => $f_date_begin );

            unless ( $dateBegin && $dateEnd ) {
                $self->errstr("couldn't get dates from $f_date_begin: $linenum");
                print STDERR "couldn't get dates from $f_date_begin: $linenum";
                return undef;
            }

            unless ($type) {
                $self->errstr( 'Unknown format:' . $config );
                print STDERR "config: $config line: $linenum\n";
                return undef;
            }

            unless ($serviceID) {
                $self->errstr( "Couldn't find service ID for: " . $serviceName );
                print STDERR "Couldn't find service ID for: $serviceName\n";
                return undef;
            }

            my $sale = RPS::Import::SaleRec->new();
            $sale->productType($type);
            $sale->mediaType(1);
            $sale->serviceID($serviceID);
            $sale->serviceProductID($service_product_id);
            $sale->artistName($artist);
            $sale->albumName($album);
            $sale->sales($grossUnits);
            $sale->salesRevenue($grossRevenue);
            $sale->returns($returns);
            $sale->returnsRevenue($returnsRevenue);
            $sale->totalRevenue($netRevenue);
            $sale->currencyCode($currency);
            $sale->countryCode($country);
            $sale->priceLevel($plevel);
            $sale->channel($channel);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->lineNum($linenum);

            #$args{dumper}($sale);  ## for cmd-line testing
            $self->_insertSale( sale => $sale );
        }

        $linenum++;
    }

    return $linenum;
}

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