package RPS::Import::AWAL::v2;

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use RPS::Import::ServiceMap;
use Common::Date;

use base 'RPS::Import::Importer';

sub _fieldMap {
       return {
           labelName    => 'U',
           serviceID    => 'D',
           countryCode  => 'Y',
           dateBegin    => 'AC',
           dateEnd      => 'AD',
           productType  => 'F',
           formatType   => 'V',
           upc          => 'L',
           albumName    => 'I',
           isrc         => 'P',
           trackName    => 'Q',
           units        => 'AF',
           currencyCode => 'AI',
           price        => 'AO',
           mediaType    => 'T',
       }
}

sub _unverifiedFieldMap {
   {
       bundleArtist => 'K',
       trackArtist  => 'S',
   };
}

sub _headerIdentifier { isrc => 'TRACK_ISRC' }

sub mediaType {
    my $self = shift;
    my $mediaType = $self->_getByFieldName("mediaType") || "";
    return if $mediaType !~ /^(audio|video)$/i;
    return ($mediaType eq "Audio" ? RPS::DB::Item::MediaType::kMediaTypeAudio : RPS::DB::Item::MediaType::kMediaTypeVideo);
}

sub _getDateBegin { $_[0]->_prepareDate( $_[0]->_getByFieldName('dateBegin') ) }
sub _getDateEnd   { $_[0]->_prepareDate( $_[0]->_getByFieldName('dateEnd')   ) }

sub _prepareDate {
   my $self = shift;
   my $date = lc (shift || '');

   my %months = (
       jan => 1,
       feb => 2,
       mar => 3,
       apr => 4,
       may => 5,
       jun => 6,
       jul => 7,
       aug => 8,
       sep => 9,
       oct => 10,
       nov => 11,
       dec => 12,
   );

   if ( $date =~ /(\d{1,2})-([a-z]{3})-(\d{2})/i ) {
        return sprintf "%04d-%02d-%02d", "20$3", $months{$2}, $1;
   } elsif ( $date =~ /(\d{1,2})[.-](\d{1,2})[.-](\d{4})/ ) { # DD.MM.YYYY
       return sprintf "%04d-%02d-%02d", "$3", $2, $1;
   } elsif ( $date =~ /^\d+$/) {
       return Common::Date->new( date => $date, type => 'excel' );
   }

   return;
}

sub serviceID {
   my $self = shift;

   my $service   = lc ($self->_getByFieldName('serviceID') || '');
   my $serviceID = $self->getServiceID($service) || $RPS::Import::ServiceMap::SERVICE_ALIASES{$service};
   return $serviceID if $serviceID;

   $self->fail("Unknown service: $service");
}

sub countryCode {
   my $self = shift;

   my $country = $self->_getByFieldName('countryCode');
   my $oCountry = Common::Country->new( search => $country );
   return $oCountry->alpha2() if $oCountry;

   $self->fail("Unable to determine country code from '$country'");
}

sub productType {
   my $self = shift;

   my $type = $self->_getByFieldName('productType') || '';
   my $isrc = $self->_getByFieldName('isrc') || '';

   if ( ($type =~ /^track$/i) || (!$type && $isrc) ) {
       return RPS::File::Sale::TYPE_TRACK;
   }
   elsif ( ($type =~ /^bundle$/i) || (!$type && !$isrc)) {
       return RPS::File::Sale::TYPE_ALBUM;
   }

   $self->fail("Unknown productType '$type'");
}

sub formatType {
   my $self = shift;

   my $type = $self->_getByFieldName('formatType') || '';
   my $service = $self->_getByFieldName('serviceID') || '';

   # RSD-11462
   if ( $self->serviceID == Client::Service::DSP_SOUNDEXCHANGE ) {
      return RPS::File::Sale::FORMAT_NON_EPHEMERAL;
   }

   if ( $type =~ /^permanent download$/i ) {
       return RPS::File::Sale::FORMAT_DOWNLOAD;
   }
   if ( $type =~ /^conditional download$/i ) {
       return RPS::File::Sale::FORMAT_TETHERED;
   }
   if ( $service =~ /pandora/i && $type =~ /^non-interactive streaming$/i) {
       return RPS::File::Sale::FORMAT_PERFORMANCE;
   }
   if ( $type =~ /^(?:non-interactive streaming|on demand streaming)$/i ) {
       return RPS::File::Sale::FORMAT_STREAM;
   }
   $self->fail("Unknown formatType '$type'");
}

sub artistName {
   my $self = shift;

   if ( $self->productType eq RPS::File::Sale::TYPE_TRACK ) {
       return $self->_getByFieldName('trackArtist');
   }
   elsif ( $self->productType eq RPS::File::Sale::TYPE_ALBUM ) {
       return $self->_getByFieldName('bundleArtist')
   }
}

sub units {
    my $self = shift;

    my $units = $self->_getByFieldName('units') || 0;
    my $price = $self->_getByFieldName('price') || 0;

    return $units if $price == 0;
    return $price < 0 ? abs($units) * -1 : abs($units);
}

sub upc {
  my $self = shift;

  my $upc = $self->_getByFieldName('upc');
  $upc *= 1 if $upc =~ /E\+/i;
  return $upc;
}

1;
