package RPS::Import::MVD;

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 File::Sale;
use Client::Service;

use lib '/app/tools/rps/lib';
use RPS::Import::SaleRec;
use RPS::Import::ServiceMap;
use base 'RPS::Import::Importer';

my %field_map = (
    1 => {
        label         => 0,     # A
        service       => 2,     # C
        territory     => 4,     # E
        period_begin  => 5,     # F
        period_end    => 6,     # G
        product_type  => 7,     # H
        format        => 8,     # I
        album_artist  => 13,    # N
        track_artist  => 24,    # Y
        catalog_id    => 9,     # J
        upc           => 10,    # K
        album_name    => 12,    # M
        isrc          => 19,    # T
        track_number  => 22,    # W
        track         => 23,    # X
        units         => 28,    # AC
        currency_code => 31,    # AF
        unit_price    => 33,    # AH
        ext_price     => 34,    # AI
        free          => 35,    # AJ
        dist_fee      => 36,    # AK
        price         => 37,    # AL
        media_type    => 38,    # AM
        net_price     => 41,    # AP
    },
);

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

my %format_map = (
    "download" => RPS::File::Sale::FORMAT_DOWNLOAD,
    "stream"   => RPS::File::Sale::FORMAT_STREAM,
    "d"        => RPS::File::Sale::FORMAT_DOWNLOAD,
    "s"        => RPS::File::Sale::FORMAT_STREAM
);

my %media_type_map = (
    "1" => RPS::DB::Item::MediaType::kMediaTypeAudio,
    "2" => RPS::DB::Item::MediaType::kMediaTypeVideo,
    "A" => RPS::DB::Item::MediaType::kMediaTypeAudio,
    "V" => RPS::DB::Item::MediaType::kMediaTypeVideo
);

#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 $offsets  = $field_map{$version};
    my %errors   = ();
    my $linenum  = 1;

    return undef unless ($lines);

    foreach my $line (@$lines) {

        #trim off the header
        my $label = $line->[ $offsets->{label} ];
        if ( $label && ( 'vendor_num' eq lc($label) ) ) {
            $linenum++;
            next;
        }
        my $serviceName    = $line->[ $offsets->{service} ];
        my $country        = $line->[ $offsets->{territory} ];
        my $date_begin     = $line->[ $offsets->{period_begin} ];
        my $date_end       = $line->[ $offsets->{period_end} ];
        my $f_product_type = $line->[ $offsets->{product_type} ];
        my $f_format       = lc $line->[ $offsets->{format} ];
        my $f_media_type   = $line->[ $offsets->{media_type} ];
        my $album_artist   = $line->[ $offsets->{album_artist} ];
        my $track_artist   = $line->[ $offsets->{track_artist} ];
        my $catalog_id     = $line->[ $offsets->{catalog_id} ];
        my $upc            = $line->[ $offsets->{upc} ];
        my $album_name     = $line->[ $offsets->{album_name} ];
        my $isrc           = $line->[ $offsets->{isrc} ];
        my $track_number   = $line->[ $offsets->{track_number} ];
        my $track          = $line->[ $offsets->{track} ];
        my $units          = $line->[ $offsets->{units} ];
        my $currency_code  = $line->[ $offsets->{currency_code} ];
        my $unit_price     = $line->[ $offsets->{unit_price} ];
        my $ext_price      = $line->[ $offsets->{ext_price} ];
        my $free           = $line->[ $offsets->{free} ];
        my $dist_fee       = $line->[ $offsets->{dist_fee} ];
        my $price          = abs($line->[ $offsets->{price} ]);
        my $net_price      = $line->[ $offsets->{net_price} ];

        ( $date_begin, $date_end ) = Common::Util::normalize_sales_month_dates( $date_begin, $date_end );
        my $product_type = $product_type_map{$f_product_type};
        my $format       = $format_map{$f_format};
        my $media_type   = $media_type_map{$f_media_type} || RPS::DB::Item::MediaType::kMediaTypeVideo;
        my $artist;

        if ( $product_type eq RPS::File::Sale::TYPE_TRACK ) {
            $artist = $track_artist;
        } elsif ( $product_type eq RPS::File::Sale::TYPE_ALBUM ) {
            $artist = $album_artist;
        }

        if ( ( $album_name || $track || $artist || $upc || $isrc ) && ( $units || $price ) ) {

            $country = "US" unless $country;

            if ( !$upc =~ /\d{12}/ ) {
                $self->errstr("odd character in upc: $upc line: $linenum");
                return undef;
            }
            $upc =~ s/-\w$//; # Removing something like trailing '-D'

            unless ( $date_begin =~ /^\d{4}\-\d{1,2}\-\d{1,2}$/ ) {
                $self->errstr("bad date in date_begin: $date_begin line: $linenum");
                return undef;
            }
            unless ( $date_end =~ /^\d{4}\-\d{1,2}\-\d{1,2}$/ ) {
                $self->errstr("bad date in date_end: $date_end line: $linenum");
                return undef;
            }

            unless ( $units =~ /^-?\d+$/ && $units != 0 ) {
                $self->errstr("Units must be a number and not 0.  line: $linenum");
                return undef;
            }

            unless ( $f_media_type eq '' || $f_media_type =~ /^(a|v|1|2)$/i ) {
                $self->errstr("Media type must be blank, 'A', 'V', '1' or '2'.  line: $linenum");
                return undef;
            }

            unless ( $f_product_type =~ /^(a|t)$/i ) {
                $self->errstr("Product type must be an 'A' or 'T'.  line: $linenum");
                return undef;
            }

            my $service_id = $self->getServiceID($serviceName) || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $serviceName };
            unless ($service_id) {
                $self->errstr("Unknown service '$serviceName'");
                return undef;
            }

            my $sale = RPS::Import::SaleRec->new();
            my $unitPrice = $price / $units if ( $units && $price != 0 );

            $units = (abs($units) * -1) if ($net_price < 0);

            $sale->serviceID($service_id);
            $sale->currencyCode($currency_code);
            $sale->labelName($label);
            $sale->countryCode($country);
            $sale->dateBegin($date_begin);
            $sale->dateEnd($date_end);
            $sale->productType($product_type);
            $sale->formatType($format);
            $sale->mediaType($media_type);
            $sale->artistName($artist);
            $sale->upc($upc);
            $sale->albumName($album_name);
            $sale->isrc($isrc)             if ( $product_type eq RPS::File::Sale::TYPE_TRACK );
            $sale->trackNum($track_number) if ( $product_type eq RPS::File::Sale::TYPE_TRACK );
            $sale->trackName($track)       if ( $product_type eq RPS::File::Sale::TYPE_TRACK );
            $sale->units($units);
            $sale->price($unitPrice);
            $sale->free($free);

            $sale->lineNum($linenum);

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

        $linenum++;

    }

    return $linenum;
}

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