package RPS::Import::DJTunes;

#Created from specs in Fog Bugz Case 9654

use strict;

use Data::Dumper;

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

my %field_map = (
    1 => {
        date_begin   => 3,
        country      => 6,
        format       => 7,
        product_type => 9,
        units        => 10,
        upc          => 11,
        isrc         => 12,
        artist       => 13,
    },
    2 => {
        channel       => 1,
        date_begin    => 4,
        country       => 6,
        format        => 7,
        product_type  => 9,
        upc           => 11,
        isrc          => 12,
        artist        => 13,
        title         => 14,
        label         => 15,
        price         => 20,
        currency_code => 21,
    },
);

my %product_type_map = (
    "track"  => RPS::File::Sale::TYPE_TRACK,
    "bundle" => RPS::File::Sale::TYPE_ALBUM
);

my %format_map    = ( "download" => RPS::File::Sale::FORMAT_DOWNLOAD, );
my $media_type    = RPS::DB::Item::MediaType::kMediaTypeAudio;
my $currency_code = "EUR";

#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 $sale = RPS::Import::SaleRec->new();

        my $country        = uc $line->[ $offsets->{country} ];
        my $f_date_begin   = lc $line->[ $offsets->{date_begin} ];
        my $f_format       = lc $line->[ $offsets->{format} ];
        my $f_product_type = lc $line->[ $offsets->{product_type} ];
        my $f_upc          = $line->[ $offsets->{upc} ];
        my $isrc           = $line->[ $offsets->{isrc} ];
        my $artist         = $line->[ $offsets->{artist} ];
        my $f_title        = $line->[ $offsets->{title} ];
        my $label          = $line->[ $offsets->{label} ];

        my ( $upc1, $upc2 ) = split( " ", $f_upc );

        my $upc = $upc1;

        $upc =~ s/[^0-9]//g;
        $isrc = normalize_isrc($isrc);

        my $product_type = $product_type_map{$f_product_type};
        my $format       = $format_map{$f_format};

        my $album;
        my $track;

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

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

        if ( $version == 2 ) {
            $self->_importLinesV2( offsets => $offsets, line => $line, sale => $sale );
        } elsif ( $version == 1 ) {
            $self->_importLinesV1( offsets => $offsets, line => $line, sale => $sale );
        }

        if (   $label
            && $country
            && $f_product_type
            && $f_format
            && $artist
            && ( $upc || $album || $isrc || $track ) ) {
            $sale->labelName($label);
            $sale->countryCode($country);
            $sale->productType($product_type);
            $sale->formatType($format);
            $sale->artistName($artist);
            $sale->upc($upc);
            $sale->dateBegin($date_begin);
            $sale->dateEnd($date_end);
            $sale->albumName($album) if ($album);
            $sale->isrc($isrc)       if ( $product_type eq RPS::File::Sale::TYPE_TRACK );
            $sale->trackName($track) if ( $product_type eq RPS::File::Sale::TYPE_TRACK );
            $sale->currencyCode($currency_code);
            $sale->mediaType($media_type);
            $sale->lineNum($linenum);

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

        $linenum++;

    }

    return $linenum;
}

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

    my $line    = $args{line};
    my $sale    = $args{sale};
    my $offsets = $args{offsets};

    my $units          = $line->[ $offsets->{units} ];
    my $f_price_part_1 = $line->[ $offsets->{price_part_1} ];
    my $f_price_part_2 = $line->[ $offsets->{price_part_2} ];

    my $price = $f_price_part_1 + ( .01 * $f_price_part_2 );

    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->free($free) if($free);
        #$sale->price($price) if(!$free);
        $sale->price($price);
    }
}

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

    my $line    = $args{line};
    my $sale    = $args{sale};
    my $offsets = $args{offsets};

    return undef unless ($line);

    my $country  = uc $line->[ $offsets->{country} ];
    my $units    = 1;
    my $price    = $line->[ $offsets->{price} ];
    my $currency = $line->[ $offsets->{currency_code} ];
    $price =~ s/","/./;
    $price =~ s/,/./;

    my $unitPrice = $price / $units;
    $sale->units($units);
    $sale->price($unitPrice);
    $sale->countryCode($country);
    $sale->currencyCode($currency);
}

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