package RPS::Import::RevolverPhysical;

use strict;

use Date::Calc qw(Days_in_Month Decode_Month Add_Delta_Days);

use lib '/app/tools/common/lib';

#use Common::Util;
use Common::Util qw(normalize_date normalize_isrc);
use Common::Consts qw(%COUNTRY_CODE);

use lib '/app/tools/data_classes/lib';
use Client::Service;

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

my %field_map = (
    2 => {
        client_product_id => 2,
        artist            => 3,
        album             => 4,
        product_type      => 5,
        units             => 9,
        price             => 12,
        date_begin        => 13,
        date_end          => 14,
    },
);

my %product_type = (
    '12"'    => RPS::File::Sale::TYPE_LP,
    '2xcd'   => RPS::File::Sale::TYPE_CD,
    '2xdvd'  => RPS::File::Sale::TYPE_DVD,
    '2xlp'   => RPS::File::Sale::TYPE_LP,
    '3xcd'   => RPS::File::Sale::TYPE_CD,
    'cd+dvd' => RPS::File::Sale::TYPE_DVD_CD_SET,
    'lp'     => RPS::File::Sale::TYPE_LP,
    '7"'     => RPS::File::Sale::TYPE_LP,
    'cd'     => RPS::File::Sale::TYPE_CD,

    # More types added per FB12358
    '3xlp'   => RPS::File::Sale::TYPE_LP,
    'lp+7"'  => RPS::File::Sale::TYPE_LP,
    'lp+cd'  => RPS::File::Sale::TYPE_LP,
    'cdep'   => RPS::File::Sale::TYPE_CD,
    '6xcd'   => RPS::File::Sale::TYPE_CD,
    'dvd+cd' => RPS::File::Sale::TYPE_DVD_CD_SET,
);

#public methods

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

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

    return undef unless ($lines);

    my $gross_total = 0;

    my $linenum  = 1;
    my $sheetnum = 0;

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

    my ( $dateBegin, $dateEnd );

    foreach my $line (@$lines) {

        my $artist            = $line->[ $offsets->{artist} ];
        my $units             = $line->[ $offsets->{units} ];
        my $price             = $line->[ $offsets->{price} ];
        my $album             = $line->[ $offsets->{album} ];
        my $client_product_id = $line->[ $offsets->{client_product_id} ];
        my $free              = 0;

        my $f_type = lc $line->[ $offsets->{product_type} ];
        my $type   = $product_type{$f_type};

        my $f_date_begin = $line->[ $offsets->{date_begin} ];
        my $f_date_end   = $line->[ $offsets->{date_end} ];

        ( $dateBegin, $dateEnd ) = $self->_getDates( $f_date_begin, $f_date_end );

        if (   $client_product_id
            && $artist
            && $album
            && $units
            && $price =~ /\d+/ ) {
            unless ( $dateBegin && $dateEnd ) {
                $self->errstr("couldn't get dates from $f_date_begin, $f_date_end at row $linenum ");
                print STDERR "$fileName\n";
                return undef;
            }

            unless ($type) {
                $self->errstr("unknown type $f_type at row $linenum ");
                print STDERR "$fileName\n";
                return undef;
            }

            #my $price = ($price / $units) if($units > 0);

            if ( $price == 0 ) {
                $free = 1;
            }

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

            $sale->clientProductID($client_product_id);
            $sale->productType($type);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->artistName($artist);
            $sale->albumName($album);
            $sale->channel(RPS::File::Sale::CHANNEL_RETAIL);
            $sale->priceLevel(RPS::File::Sale::PLEVEL_FULL);

            if ( $units < 0 ) {

                # returns
                $units *= -1;
                $price *= -1 if ( $price < 0 );
                $sale->returns($units);
                $sale->returnsRevenue($price);
                $sale->totalRevenue( $price * -1 );
            } else {
                $sale->sales($units);
                $sale->salesRevenue($price);
                $sale->totalRevenue($price);
            }

            $sale->lineNum($linenum);
            $sale->free($free);
            $sale->countryCode("US");    # all Revolver Physical sales are US (FB12358)
                                         #$args{dumper}($sale);  ## for cmd-line testing
            $self->_insertSale( sale => $sale );
        }

        $linenum++;
    }

    return $linenum;
}

#
# Private methods
#

sub _getDates {
    my $self       = shift;
    my $date_begin = shift;
    my $date_end   = shift;

    my ( $begin_month, $begin_year, $begin_day, $end_month, $end_year, $end_day );

    if ( $date_begin =~ /\d{4}\D\d{2}\D\d{2}/ && $date_end =~ /\d{4}\D\d{2}\D\d{2}/ ) {
        return ( $date_begin, $date_end );
    }

    if ( $date_begin =~ /^(\d+)$/ ) {
        ( $begin_year, $begin_month, $begin_day ) = Add_Delta_Days( 1900, 1, 1, $1 - 2 );
    } else {
        return undef;
    }

    if ( $date_end =~ /^(\d+)$/ ) {
        ( $end_year, $end_month, $end_day ) = Add_Delta_Days( 1900, 1, 1, $1 - 2 );

    } else {
        return undef;
    }

    my $dateBegin = sprintf( "%04d-%02d-%02d", $begin_year, $begin_month, $begin_day );
    my $dateEnd   = sprintf( "%04d-%02d-%02d", $end_year,   $end_month,   $end_day );

    return ( $dateBegin, $dateEnd );

}

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