package RPS::Import::UniversalCAPhysical;

use strict;

use Date::Calc qw(Days_in_Month Add_Delta_Days);

use lib '/app/tools/common/lib';
use Common::Util;
use Common::Consts;

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

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

my %channelMap = (
    retail       => RPS::File::Sale::CHANNEL_RETAIL,
    military     => RPS::File::Sale::CHANNEL_MILITARY,
    club         => RPS::File::Sale::CHANNEL_CLUB,
    'mail order' => RPS::File::Sale::CHANNEL_MAILORDER,
    direct       => RPS::File::Sale::CHANNEL_DIRECT,
);

# map version num to the field order
my %fieldMap = (
    6 => {
        catalog_id      => 3,
        artist          => 4,
        title           => 6,
        pricetype       => 8,
        sales           => 9,
        sales_revenue   => 12,
        returns         => 13,
        returns_revenue => 14,
    },
    9 => {
        catalog_id      => 2,
        artist          => 3,
        title           => 5,
        pricetype       => 7,
        sales           => 8,
        sales_revenue   => 11,
        returns         => 12,
        returns_revenue => 13,
    },
);

#public methods

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

    my $lines    = $args{lines};
    my $fileObj  = $args{file};
    my $fileName = $fileObj->OrigFileName;
    my $version  = $self->_version;

    return undef unless ( defined $lines && defined $version );

    my $offsets = $fieldMap{$version};
    my $linenum = 1;
    my ( $dateBegin, $dateEnd ) = _getDates($fileName);

    foreach my $line (@$lines) {
        my $price_level  = RPS::File::Sale::PLEVEL_FULL;
        my $channel      = RPS::File::Sale::CHANNEL_RETAIL;
        my $prodtype     = RPS::File::Sale::TYPE_CD;
        my $catno        = $line->[ $offsets->{catalog_id} ];
        my $artist       = $line->[ $offsets->{artist} ];
        my $album        = $line->[ $offsets->{title} ];
        my $countryCode  = "CA";
        my $currencyCode = "CAD";

        unless ( defined $dateBegin && defined $dateEnd ) {
            $self->errstr( "couldn't get dates from " . $line->[ $offsets->{date} ] );
            return undef;
        }

        my $sales   = $line->[ $offsets->{sales} ];
        my $returns = $line->[ $offsets->{returns} ];
        $returns *= -1 if ( $returns < 0 );
        my ($sales_price)   = $line->[ $offsets->{sales_revenue} ];
        my ($returns_price) = $line->[ $offsets->{returns_revenue} ];
        $sales   = 0 if ( $sales eq "" );
        $returns = 0 if ( $returns eq "" );
        $returns_price *= -1 if ( $returns_price < 0 );
        my $net_price = $sales_price - $returns_price;

        if ( $prodtype && $artist ne "" && $album !~ /title/i && ( $sales_price != 0 || $returns_price != 0 ) && ( $album || $catno ) ) {
            my $sale = RPS::Import::SaleRec->new();

            $sale->productType($prodtype);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->clientProductID($catno);
            $sale->artistName($artist);
            $sale->albumName($album);
            $sale->sales($sales);
            $sale->salesRevenue($sales_price);
            $sale->returns($returns);
            $sale->returnsRevenue($returns_price);
            $sale->totalRevenue($net_price);
            $sale->priceLevel($price_level);
            $sale->channel($channel);
            $sale->countryCode($countryCode);
            $sale->currencyCode($currencyCode);
            $sale->lineNum($linenum);

            $self->_insertSale( sale => $sale );
        }

        #else { print STDERR "Skip l:".$linenum." p:".$prodtype." np:".$net_price." a:".$album." s:".$sales." r:".$returns."\n"; }
        $linenum++;
    }

    $fileObj->Physical(1);
    $fileObj->Save();
    return $linenum;
}

#
# Private methods
#

sub _getDates {
    my $date = shift;
    my ( $month, $year );

    if ( $date =~ m/(\d{4})\D(\d+)/ ) {
        $month = $2;
        $year  = $1;
    } elsif ( $date =~ m/^(\d+)\D(\d{4})/ ) {
        $month = $1;
        $year  = $2;
    }
    if ( $month ne "" && $year ne "" ) {
        return ( $year . "-" . $month . "-01", $year . "-" . $month . "-" . Days_in_Month( $year, $month ) );
    }
    return undef;
}

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