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
    },
);

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);

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              = $line->[$offsets->{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::kMediaTypeAudio;
        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) ) {

            unless ( $country && '' ne $country ) {
                 $self->errstr("Missing country code.  line: $linenum" );
                 return undef;
            }

            if( ! $upc =~ /\d{12}/ ) {
                 $self->errstr("odd character in upc: $upc line: $linenum" );
                 return undef;
            }

            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);


            $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.
###
