#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# Copyright (C) 2014 RoyaltyShare, Inc.   All Rights Reserved
#---------------------------------------------------------------
package RPS::Import::Merlin::Spotify;

use strict;
use warnings;

use Date::Calc qw(Decode_Month Days_in_Month);

use lib '/app/tools/common/lib';
use Common::Assert;
use Common::Util qw(normalize_upc);

use lib '/app/tools/rps/lib';

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

sub _fieldMap {
    my $self      = shift;
    my %field_map = (
        44 => {
            countryCode => 'A',
            artistName  => 'I',
            upc         => 'E',
            albumName   => 'K',
            isrc        => 'G',
            trackName   => 'H',
            units       => 'L',
            price       => 'M',
        },
        45 => {
            countryCode => 'A',
            artistName  => 'J',
            upc         => 'F',
            albumName   => 'L',
            isrc        => 'H',
            trackName   => 'I',
            units       => 'M',
            price       => 'N',
        },
        60 => {
            labelName    => 'B',
            countryCode  => 'A',
            dateBegin    => 'B2',
            dateEnd      => 'C2',
            artistName   => 'I',
            upc          => 'E',
            albumName    => 'K',
            isrc         => 'G',
            trackName    => 'H',
            units        => 'L',
            currencyCode => 'M',
            price        => 'N',
        },
    );
    return $field_map{ $self->_version };
}

sub _unverifiedFieldMap {
    my $self      = shift;
    my %field_map = (
        44 => {
            ean => 'F',
        },
        45 => {
            ean => 'G',
        },
        60 => {
            ean => 'F',
        },
    );
    return $field_map{ $self->_version };
}

sub _headerIdentifier { upc => 'UPC' }

sub serviceID   { Client::Service::DSP_SPOTIFY; }
sub productType { RPS::File::Sale::TYPE_TRACK; }
sub formatType  { RPS::File::Sale::FORMAT_STREAM; }
sub mediaType   { RPS::DB::Item::MediaType::kMediaTypeAudio; }

sub upc {
    my $self = shift;

    my $upc  = $self->_getByFieldName('upc');
    $upc = $self->_getByFieldName('ean') unless $upc;

    return Common::Util::normalize_upc($upc);
}

sub saleDates {
    my $self = shift;

    return ( $self->{_startDate}, $self->{_endDate} ) if ( $self->{_startDate} );

    if ( $self->_version == 60 ) {
        my $startDate = $self->_getByFieldName('dateBegin');
        my $endDate   = $self->_getByFieldName('dateEnd');

        # yyyy-mm-dd
        return ($startDate, $endDate) if $startDate =~ /^\d\d\d\d-\d\d-\d\d$/;

        # m/dd/yy
        $startDate =~ /^(\d{1,2})[-\/]\d{1,2}[-\/](\d\d)$/;
        $startDate = sprintf( "20%02d-%02d-%02d", $2, $1, 1 );
        $endDate = sprintf( "20%02d-%02d-%02d", $2, $1, Days_in_Month( $2, $1 ) );
        return ($startDate, $endDate);
    }

    my $dateBegin;
    if ( $self->filename =~ /(\d{4}) (september|october|november|december|january|february|march|april|may|june|july|august)/i ) {
        my $month = Decode_Month($2);
        my $year  = $1;
        $dateBegin = sprintf( "%04d-%02d-%02d", $year, $month, 1 );
    } else {
        $self->fail( "Could not determine period from filename '" . $self->filename . "'" );
    }

    ( $self->{_startDate}, $self->{_endDate} ) = $self->_getDates( date_begin => $dateBegin );

    return ( $self->{_startDate}, $self->{_endDate} );

}

sub countryCode {
    my $self    = shift;

    my $country = $self->_getByFieldName('countryCode');
    my $obj     = Common::Country->Get($country);

    return $obj ? $obj->alpha2 : undef;
}

sub currencyCode {
    my $self = shift;

    if ( $self->_version == 60 ) {
        return $self->_getByFieldName('currencyCode');
    }

    return $self->{_currencyCode};
}

sub _processHeader {
    my $self   = shift;

    return unless $self->_version == 60;

    my $header = $self->_getByFieldName('price') || "";

    if ( $header =~ /^(\w+) Payable$/i ) {
        $self->{_currencyCode} = $1;
    }

    return $self->SUPER::_processHeader(@_);
}

###
1;    # Play nicely.
###
