package RPS::Import::Boomkat;

#Version 1 created from specs in Fog Bugz Case 9556

use strict;

use Date::Calc qw(Days_in_Month Decode_Month);

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

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

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 = (
    1 => {
        service           => 1,
        date              => 3,
        artist            => 4,
        title             => 5,
        label             => 6,
        product_type      => 7,
        client_product_id => 9,
        upc               => 10,
        isrc              => 11,
        units             => 17,
        price             => 18,
        currency_code     => 22,
        country_code      => 23,
    },
    2 => {
        service           => 1,
        date              => 3,
        artist            => 4,
        title             => 5,
        label             => 6,
        product_type      => 7,
        client_product_id => 9,
        upc               => 10,
        isrc              => 11,
        units             => 17,
        price             => 18,
        currency_code     => 20,
        country_code      => 21,
    },
);

my %product_type_map = (
    "b_album"  => RPS::File::Sale::TYPE_ALBUM,
    "b_ep"     => RPS::File::Sale::TYPE_ALBUM,
    "b_single" => RPS::File::Sale::TYPE_TRACK
);

#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} };

    return undef unless ($lines);

    my $linenum = 1;

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

    $linenum = 1;

    foreach my $line (@$lines) {

        my $f_service = $line->[ $offsets->{service} ];
        my $f_date    = $line->[ $offsets->{date} ];
        my $artist    = $line->[ $offsets->{artist} ];
        my $title     = $line->[ $offsets->{title} ];
        my $album;
        my $track;
        my $label             = $line->[ $offsets->{label} ];
        my $f_product_type    = lc $line->[ $offsets->{product_type} ];
        my $client_product_id = $line->[ $offsets->{client_product_id} ];
        my $upc               = $line->[ $offsets->{upc} ];
        my $isrc              = $line->[ $offsets->{isrc} ];
        my $units             = $line->[ $offsets->{units} ];
        my $price             = $line->[ $offsets->{price} ];
        my $currency_code     = $line->[ $offsets->{currency_code} ];
        my $country_code      = $line->[ $offsets->{country_code} ];

        my ( $date_begin, $date_end );

        ( $date_begin, $date_end ) = $self->_getDates( date_begin => $f_date, type => "iso" );

        my $product_type;

        if ( $f_product_type =~ /track/ ) {
            $product_type = RPS::File::Sale::TYPE_TRACK;
        } elsif ( $f_product_type =~ /release/ ) {
            $product_type = RPS::File::Sale::TYPE_ALBUM;
        }

        my $format     = RPS::File::Sale::FORMAT_DOWNLOAD;
        my $media_type = RPS::DB::Item::MediaType::kMediaTypeAudio;

        if (   $artist
            && $title
            && $label
            && $f_product_type
            && $units =~ /\d+/
            && $price =~ /\d+/
            && $f_date
            && $currency_code
            && $country_code ) {
            if ( ( $units == 0 ) && ( $price == 0 ) ) {
                $linenum++;
                next;
            }

            unless ( $date_begin && $date_end ) {
                $self->errstr("Couldn't get dates from: $f_date line number: $linenum");
                print STDERR "Couldn't get dates from: $f_date line number: $linenum\n";
                return undef;
            }

            unless ($product_type) {
                $self->errstr("Unknown product type: $f_product_type at linenum: $linenum");
                print STDERR "Unknown product type: $f_product_type at linenum: $linenum\n";
                return undef;
            }

            unless ( $Common::Consts::CODE_TO_COUNTRY{$country_code} ) {
                $self->errstr("Unknown country code: $country_code at line number: $linenum");
                print STDERR "Unknown country code: $country_code at line number: $linenum\n";
                return undef;
            }

            if ( $product_type eq RPS::File::Sale::TYPE_ALBUM ) {
                $album = $title;
            } elsif ( $product_type eq RPS::File::Sale::TYPE_TRACK ) {
                $track = $title;
            }

            my $sale = RPS::Import::SaleRec->new();
            $sale->dateBegin($date_begin);
            $sale->dateEnd($date_end);
            $sale->artistName($artist);
            $sale->albumName($album);
            $sale->trackName($track) if ( $product_type eq RPS::File::Sale::TYPE_TRACK );
            $sale->labelName($label);
            $sale->productType($product_type);
            $sale->clientProductID($client_product_id);
            $sale->upc($upc);
            $sale->isrc($isrc) if ( $product_type eq RPS::File::Sale::TYPE_TRACK );
            $sale->currencyCode($currency_code);
            $sale->countryCode($country_code);

            #$sale->serviceID($service_id);
            $sale->formatType($format);
            $sale->mediaType($media_type);
            $sale->lineNum($linenum);

            if ( ( $units == 0 ) && ( $price != 0 ) ) {

                if ( $price < 0 ) {
                    $sale->units(-1);
                    $sale->price( abs $price );
                    $self->_insertSale( sale => $sale );

                    $sale->units(1);
                    $sale->price(0);
                    $self->_insertSale( sale => $sale );
                } elsif ( $price > 0 ) {
                    $sale->units(1);
                    $sale->price($price);
                    $self->_insertSale( sale => $sale );

                    $sale->units(-1);
                    $sale->price(0);
                    $self->_insertSale( sale => $sale );
                }
            } else {

                if ( ( $units > 0 ) && ( $price > 0 ) ) {
                    $price /= $units;
                } elsif ( ( $units > 0 ) && ( $price < 0 ) ) {
                    $price = ( abs $price ) / $units;
                    $units *= -1;
                } elsif ( ( $units < 0 ) && ( $price > 0 ) ) {
                    $price = $price / ( abs $units );
                } elsif ( ( $units < 0 ) && ( $price < 0 ) ) {
                    $price = ( abs $price ) / ( abs $units );
                }

                $sale->units($units);
                $sale->price($price);

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

        $linenum++;

    }

    return $linenum;
}

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