package RPS::Import::EMIMusic::Subscriptions::v1;

use strict;

use lib '/app/tools/data_classes/lib';
use lib '/app/tools/common/lib';
use lib '/app/tools/rps/lib';
use lib '/app/tools/raptor/lib';
use Common::Date;
use Common::Log;
use Common::RSMath;
use Client::Service;

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

use Data::Dumper;

# !!! This will probably go someplace else, eventually.
#
my %gEtailerToServiceMap = (
    '1010015060' => Client::Service::DSP_VEVO(), # vevo
);


sub _getServiceIDFromEtailerCode
{
    my ($self, $code) = @_;
    return $gEtailerToServiceMap{$code};
}

sub _headerIdentifier
{
    'rowType' => 'H',
} 


sub _unverifiedFieldMap {
    {
# These are header columns.
#
        rowType  => 'A',
        etailerCode => 'D',
        streamCount => 'F',
        headerCurrencyCode => 'G',
        totalValue => 'H',

# This is the 'id' column. Usually it's a DTI, sometimes an ISRC,
# and sometimes an EAN or UPC.
# We'll keep it generic and decipher it as we go.
#        apparent_id          => 'H',
    }
}

sub _fieldMap {
    {
        countryCode      => 'C',
        units            => 'F',
        artistName       => 'I',
        trackName        => 'J',
        dateBegin        => 'G',
        clientProductID  => 'H',
#        isrc             => 'H',
        comments         => 'E', # !!! This is their Service Level Code.  Just storing it in comments for now.
    }
}

sub _processHeader {
    my $self = shift;


    # In theory we've already figured out the service ID we want to use.
    # But I am paranoid about the multiple headers I'm seeing in these files, so
    # I want to record the 'etailerCode' from the initial header to test against
    # the other headers.
    #
    my $etailerCode = $self->_getByFieldName('etailerCode');
    $self->{_etailerCode} = $etailerCode;

    # Now parse everything else.
    # This is stuff that might change from block-to-block.
    #
    $self->_processNewHeader();
}

sub _processNewHeader
{
    my ($self) = @_;

    my $currencyCode = $self->_getByFieldName('headerCurrencyCode');
    my $streams = $self->_getByFieldName('streamCount');
    my $total = $self->_getByFieldName('totalValue');

    $self->{_currencyCode} = $currencyCode;

    my $pricePerStream = $total / $streams;
    $self->{_price} = Common::RSMath::round($total / $streams, 8);
}


sub _isValidSaleRecord
{
    my ($self) = @_;

    my $rowType = $self->_getByFieldName('rowType');
    if ('D' eq $rowType)
    {
        # It _claims_ to be a data line...
        #
        return $self->SUPER::_isValidSaleRecord();
    }

    # If this is not the first header, let's see if anything unexpected changed...
    #
    if ('H' eq $rowType && defined $self->{_etailerCode})
    {
        if ($self->_getByFieldName('etailerCode') ne $self->{_etailerCode})
        {
            die "ERROR - etailer code unexpectedly changed!";
        }

        # Parse the header line to grab the (possibly) new currency and price data.
        #
        $self->_processNewHeader();
    }

    return 0;
}

sub currencyCode
{
    my ($self) = @_;

    die "ERROR - currency code not yet determined" unless $self->{_currencyCode};
    return $self->{_currencyCode};
}

sub unitPrice
{
    my ($self) = @_;

    die "ERROR - price not yet determined" unless defined $self->{_price};
    return $self->{_price};
}


sub productType { RPS::File::Sale::TYPE_TRACK }
sub formatType  { RPS::File::Sale::FORMAT_STREAM }

sub isrc
{
    my ($self) = @_;

    my $id = $self->_getByFieldName('clientProductID');
    return undef if ($id =~ /\d{12}/);
    return $id;
}

sub upc
{
    my ($self) = @_;

    my $id = $self->_getByFieldName('clientProductID');
    return undef unless ($id =~ /\d{12}/);
    return $id;
}


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