package RPS::Import::KochPhysArc;

use strict;

use Date::Calc qw(Days_in_Month Decode_Month);

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 RPS::Import::Importer;
use base 'RPS::Import::Importer';

my %field_map = (
    2 => {
        date            => 0,
        catalog_number  => 0,
        artist_album    => 2,
        sales           => 4,
        returns         => 5,
        sales_revenue   => 7,
        returns_revenue => 8,
        discount        => 9,
        net_revenue     => 10,
    },
    3 => {
        date            => 0,
        catalog_number  => 0,
        sales           => 1,
        returns         => 2,
        sales_revenue   => 4,
        returns_revenue => 5,
        discount        => 6,
        net_revenue     => 7,
    },
    4 => {
        date            => 0,
        catalog_number  => 1,
        artist_album    => 2,
        sales           => 4,
        returns         => 6,
        sales_revenue   => 11,
        returns_revenue => 12,
        discount        => 14,
        net_revenue     => 15,
    },
    5 => {
        date            => 0,
        catalog_number  => 0,
        upc             => 1,
        artist_album    => 4,
        sales           => 10,
        returns         => 12,
        sales_revenue   => 17,
        returns_revenue => 19,
        discount        => 21,
        net_revenue     => 24,
    },
    6 => {
        date            => 0,
        catalog_number  => 1,
        upc             => 2,
        artist_album    => 5,
        sales           => 12,
        returns         => 14,
        sales_revenue   => 19,
        returns_revenue => 21,
        discount        => 23,
        net_revenue     => 26,
    },
    7 => {
        date            => 0,
        catalog_number  => 1,
        upc             => 2,
        artist_album    => 5,
        sales           => 9,     # J-K ("UNITS SHIPPED")
        returns         => 11,    # L-M ("UNITS RETURNED")
        sales_revenue   => 15,    # P   ("DOLLARS SHIPPED")
        returns_revenue => 16,    # Q-R ("DOLLARS RETURNED")
        discount        => 19,    # T-U ("DISCOUNT DOLLARS")
        net_revenue     => 22,    # W   ("NET DOLLARS")
    },
);

my %product_type_map = (
    "cd" => RPS::File::Sale::TYPE_CD,
    "dv" => RPS::File::Sale::TYPE_DVD,
    "bo" => RPS::File::Sale::TYPE_CD,
    "mc" => RPS::File::Sale::TYPE_CASS,
    "lp" => RPS::File::Sale::TYPE_LP
);

#public methods
my $total_revenue_count;
my $net_revenue_count;

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

    my $lines    = $args{lines};
    my $sheets   = $args{sheets};
    my $fileObj  = $args{file};
    my $fileName = $fileObj->OrigFileName;
    my $version  = $fileObj->VersionNum;
    my $offsets  = $field_map{$version};
    my ( $dateBegin, $dateEnd );
    my $linenum = 1;

    foreach my $line (@$lines) {

        if ( $line->[ $offsets->{date} ] =~ m/Month Period:  (\d+)\D(\d{4})/ ) {
            my $date = $2 . "-" . $1 . "-01";
            ( $dateBegin, $dateEnd ) = $self->SUPER::_getDates( date_begin => $date );
        }

        my $prodtype;
        my $catalog_number = $line->[ $offsets->{catalog_number} ];
        my ( $artist, $album );
        if ( $version != 3 ) {
            ( $artist, $album ) = split( ":", $line->[ $offsets->{'artist_album'} ] )
              if ( $line->[ $offsets->{artist_album} ] =~ /\:/ );

            ( $artist, $album ) = split( "\/", $line->[ $offsets->{'artist_album'} ] )
              if ( $line->[ $offsets->{artist_album} ] =~ /\// );
            ( $artist, $album ) = split( ";", $line->[ $offsets->{'artist_album'} ] )
              if ( $line->[ $offsets->{artist_album} ] =~ /\;/ );
            $album = $line->[ $offsets->{'artist_album'} ]
              if ( $line->[ $offsets->{artist_album} ] !~ /\:/ );
        }

        my $f_product_type = lc $catalog_number;

        if ( $f_product_type =~ /-([a-z]+)-/ ) {
            $prodtype = $product_type_map{$1};
        }

        #$prodtype               = RPS::File::Sale::TYPE_CD if($catalog_number =~ /-CD-/);
        #$prodtype               = RPS::File::Sale::TYPE_DVD if($catalog_number =~ /-DV-/);
        my $sales         = $line->[ $offsets->{sales} ];
        my $returns       = $line->[ $offsets->{returns} ];
        my $sales_revenue = $line->[ $offsets->{sales_revenue} ];

        my $returns_revenue = $line->[ $offsets->{returns_revenue} ];
        my $discount        = $line->[ $offsets->{discount} ];
        $returns         *= -1 if ( $returns < 0 );
        $returns_revenue *= -1 if ( $returns_revenue < 0 );

        my $upc;
        if ( defined $offsets->{upc} ) {
            $upc = $line->[ $offsets->{upc} ];
        }

        if ( $sales == 0 ) {
            $returns_revenue += $discount if ( $discount > 0 );
            $returns_revenue -= ( $discount * -1 ) if ( $discount < 0 );
        } else {
            $sales_revenue -= $discount if ( $discount > 0 );
            $sales_revenue += ( $discount * -1 ) if ( $discount < 0 );
        }

        my $total_revenue = $sales_revenue - $returns_revenue;
        my $net_revenue   = $line->[ $offsets->{net_revenue} ];

        if (   $f_product_type
            && ( $album || $version == 3 || $artist )
            && $net_revenue =~ /\d+/ ) {
            unless ( $sales || $returns ) {
                $self->errstr("Revenue detected on line $linenum with zero net units");
                return undef;
            }

            unless ($prodtype) {
                $self->errstr( "Could not get product type from: " . "$f_product_type at line number: $linenum" );

                print STDERR "Could not get product type from: " . "$f_product_type at line number: $linenum\n";
                return undef;
            }

            unless ( $dateBegin && $dateEnd ) {
                $self->errstr("couldn't get dates from $fileName");
                return undef;
            }

            if ( ( $net_revenue + ( $total_revenue * -1 ) ) > .01 ) {
                die "Net revenue: $net_revenue does not equal total revenue: $total_revenue";
            }

            $total_revenue_count += $total_revenue;
            $net_revenue_count   += $net_revenue;

            if ( ( $sales == 0 ) && ( $returns == 0 ) ) {
                if ( $net_revenue == 0 ) {
                    $linenum++;
                    next;
                } elsif ( $net_revenue < 0 ) {
                } elsif ( $net_revenue > 0 ) {
                }
            }

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

            $sale->upc($upc);
            $sale->productType($prodtype);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->artistName($artist);
            $sale->albumName($album);
            $sale->sales($sales);
            $sale->salesRevenue($sales_revenue);
            $sale->returns($returns);
            $sale->returnsRevenue($returns_revenue);
            $sale->channel(RPS::File::Sale::CHANNEL_RETAIL);
            $sale->priceLevel(RPS::File::Sale::PLEVEL_FULL);
            $sale->totalRevenue($total_revenue);
            $sale->serviceProductID($catalog_number);
            $sale->countryCode('US');
            $sale->lineNum($linenum);

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

        #else { print STDERR "skip l:".$linenum." p:".$prodtype." s:". $sales." al:".$album." ar:".$artist." d:".$dateBegin."\n"; }
        $linenum++;
    }

    #print STDERR "Total revenue count: $total_revenue_count net revenue count: $net_revenue_count\n";
    return $linenum;
}

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