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.
###
