package RPS::Import::7Digital::v16;

use strict;

use Date::Calc qw(Days_in_Month);

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

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

sub _fieldMap {
    my $self = shift;

    my %map = (
        16 => {
            # header
            dateBegin => 'A2',
            dateEnd   => 'B2',

            # detail
            labelName   => 'I',
            upc         => 'H',
            productType => 'N',
            formatType  => 'L',
            albumName   => 'D',
            isrc        => 'G',
            trackName   => 'F',
            price       => 'AA',
            countryCode => 'K',
        },
        17 => {
            dateBegin    => 'B',
            dateEnd      => 'B',

            labelName    => 'I',
            countryCode  => 'K',
            productType  => 'N',
            formatType   => 'L',
            upc          => 'H',
            albumName    => 'D',
            isrc         => 'G',
            trackName    => 'F',
            price        => 'AA',
            mediaType    => 'L',
        },
        18 => {
            # header
            dateBegin => 'A2',
            dateEnd   => 'B2',

            # detail
            labelName   => 'I',
            upc         => 'H',
            productType => 'N',
            formatType  => 'L',
            albumName   => 'D',
            isrc        => 'G',
            trackName   => 'F',
            price       => 'V',
            countryCode => 'K',
        },
    );

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

sub _unverifiedFieldMap {
    my $self = shift;

    my %map = (
        16 => {
            productArtist => 'C',
            trackArtist   => 'E',
            serviceName   => 'J',
        },
        17 => {
            serviceName   => 'J',
            productArtist => 'C',
            trackArtist   => 'E',
        },
        18 => {
            productArtist => 'C',
            trackArtist   => 'E',
            serviceName   => 'J',
        },
    );

    return $map{ $self->_version };
}
sub _headerIdentifier { ( upc => 'UPC' ) }

sub units { 1 }

sub currencyCode {
    return "GBP";
}

sub saleDates {
    my $self  = shift;

    return $self->SUPER::saleDates if $self->_version == 17;

    my $sdate = $self->_getByFieldName('dateBegin');
    my $edate = $self->_getByFieldName('dateEnd');

    my $dateBegin;
    my $dateEnd;
    if ( $sdate =~ /(2\d{3})(\d{2})(\d{2})/ ) {
        my ( $sYear, $sMonth, $sDay ) = ( $1, $2, $3 );
        if ( $edate =~ /(2\d{3})(\d{2})(\d{2})/ ) {
            $dateBegin = sprintf( "%04d-%02d-%02d", $sYear, $sMonth, $sDay );
            $dateEnd   = sprintf( "%04d-%02d-%02d", $1,     $2,      $3 );
        }
    }

    return ( $dateBegin, $dateEnd );
}

sub serviceID {
    my $self        = shift;
    my $serviceName = $self->_getByFieldName('serviceName');
    my $serviceID   = $self->getServiceID($serviceName)
      || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $serviceName };

    return $serviceID if ($serviceID);

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

sub productType {
    my $self = shift;
    my $type = $self->_getByFieldName('productType');
    return ( $type == 1 ) ? RPS::File::Sale::TYPE_TRACK : RPS::File::Sale::TYPE_ALBUM;
}

sub formatType {
    my $self = shift;

    my $type = $self->_getByFieldName('formatType');
    if ( $type =~ /^mp3$/i ) {
        return RPS::File::Sale::FORMAT_DOWNLOAD;
    } elsif ( $type =~ /^flac$/i ) {
        return $self->_version == 17
            ? RPS::File::Sale::FORMAT_DOWNLOAD
            : RPS::File::Sale::FORMAT_DOWNLOADPREMIUM;
    }

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

sub mediaType { return RPS::DB::Item::MediaType::kMediaTypeAudio; }

sub artistName {
    my $self = shift;

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

1;
