package RPS::Import::7Digital::v19;

use strict;
use warnings;

use Date::Calc qw(Days_in_Month);
use Spreadsheet::ParseExcel;

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

use parent 'RPS::Import::Importer';

sub _fieldMap {
    {
        labelName    => 'K',
        serviceID    => 'L',
        countryCode  => 'M',
        dateBegin    => 'B',
        dateEnd      => 'B',
        productType  => 'P',
        formatType   => 'N',
        upc          => 'J',
        albumName    => 'F',
        isrc         => 'I',
        trackName    => 'H',
        currencyCode => 'X',
        price        => 'X',
        mediaType    => 'N',
    }
}

sub _unverifiedFieldMap {
    {
        productArtist => 'C',
        trackArtist   => 'G',
    }
}
sub _headerIdentifier { upc => 'UPC' }

sub units        { 1 }
sub currencyCode { shift->{_currencyCode} }

sub saleDates {
    my $self  = shift;

    my $dateBegin = $self->_getByFieldName('dateBegin') || '';
    $dateBegin = Spreadsheet::ParseExcel::Utility::ExcelFmt( "yyyy-mm-dd", $dateBegin ) if $dateBegin =~ /^\d+$/;
    $dateBegin =~ /^(\d{4})-(\d{2})-(\d{2})$/;

    return
        sprintf( "%04d-%02d-%02d", $1, $2, 1 ),
        sprintf "%04d-%02d-%02d", $1, $2, Days_in_Month( $1, $2 );
}

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 $name = $self->_getByFieldName('countryCode') || '';
    my $oCountry = Common::Country->Get($name);
    return $oCountry->alpha2() if $oCountry;

    $self->fail( "Unable to determine country_code from: '$name'." );
}

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || 0;
    unless ( $type =~ /^\d+$/ && $type > 0 ) {
        $self->fail("Unable to determine productType from: '$type'.");
    }

    return $type == 1 ? RPS::File::Sale::TYPE_TRACK : RPS::File::Sale::TYPE_ALBUM;
}

sub formatType {
    my $self = shift;

    my $type = $self->_getByFieldName('formatType') || '';
    return RPS::File::Sale::FORMAT_DOWNLOAD if $type =~ /^(?:MP3|FLAC)$/i;

    $self->fail("Unable to determine formatType from: '$type'.");
}

sub artistName {
    my $self = shift;

    return $self->productType eq RPS::File::Sale::TYPE_TRACK
        ? $self->_getByFieldName('trackArtist')
        : $self->_getByFieldName('productArtist');
}

sub mediaType {
    my $self = shift;

    my $type = $self->_getByFieldName('formatType') || '';
    return RPS::DB::Item::MediaType::kMediaTypeAudio if $type =~ /^(?:MP3|FLAC)$/i;

    $self->fail("Unable to determine mediaType from: '$type'.");
}

sub _processHeader {
    my $self = shift;

    return unless $self->_isHeader;

    my $currencyHeader = $self->_getByFieldName('currencyCode') || '';
    unless ( $currencyHeader =~ /\((\w{3})\)/i ) {
        $self->fail("Unable to determine currencyCode from: '$currencyHeader'.");
    }

    return $self->{_currencyCode} = $1;
}


1;