package RPS::Import::AWAL::v1;

use strict;
use warnings;

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

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

sub _fieldMap {
   my $self = shift;

   my %fieldMap = (
       1 => {
            labelName    => 'T',
            serviceID    => 'C',
            countryCode  => 'W',
            dateBegin    => 'AA',
            dateEnd      => 'AB',
            productType  => 'E',
            formatType   => 'U',
            albumName    => 'H',
            isrc         => 'O',
            trackName    => 'P',
            units        => 'AD',
            currencyCode => 'AG',
            price        => 'AL',
            mediaType    => 'S',
       },
   );

   return $fieldMap{ $self->_version };
}

sub _unverifiedFieldMap {
   {
       bundleArtist => 'J',
       trackArtist  => 'R',
   };
}

sub _headerIdentifier { isrc => 'TRACK_ISRC' }
sub mediaType         { RPS::DB::Item::MediaType::kMediaTypeAudio }

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{4})[.-](\d{1,2})[.-](\d{1,2})/ ) { # YYYY.MM.DD
        return sprintf "%04d-%02d-%02d", $1, $2, $3;
    } 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') || '';
    if ( $type =~ /^track$/i ) {
        return RPS::File::Sale::TYPE_TRACK;
    }
    elsif ( $type =~ /^bundle$/i) {
        return RPS::File::Sale::TYPE_ALBUM;
    }

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

sub formatType {
    my $self = shift;

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

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

    if ( $type =~ /^permanent download/i ) {
        return RPS::File::Sale::FORMAT_DOWNLOAD;
    }
    if ( $type =~ /^conditional download$/i ) {
        return RPS::File::Sale::FORMAT_TETHERED;
    }
    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')
    }

    return;
}

sub units {
    my $self = shift;

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

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

    return $units;
}

1;
