package RPS::Import::Merlin::v8;

use strict;

use lib '/app/tools/common/lib';
use Common::Date;

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

use Data::Dumper;

sub _headerIdentifier { ( upc => 'UPC' ) }

sub _fieldMap {
    {
        # From header
        dateBegin    => 'A', 
        dateEnd      => 'B',                      
        serviceID    => 'C',

        # Detail
        currencyCode => 'M',
        countryCode  => 'D',
        formatType   => 'R',
        mediaType    => 'N',
        units        => 'J',
        isrc         => 'E',
        upc          => 'F',
        artistName   => 'G',
        trackName    => 'H',
        albumName    => 'I',
        labelName    => 'C',
        price        => 'L', # net price
    }
}

sub _unverifiedFieldMap {
    {
        distFee     => 'M',
    }
}

#sub currencyCode { 'USD' }

sub productType { RPS::File::Sale::TYPE_TRACK; }


sub formatType
{
    my $self = shift;
    my $format = $self->_getByFieldName( 'formatType' ) || return;

    if( $format =~ /^play$/i )
    {
        $format = RPS::File::Sale::FORMAT_STREAM;
    }
    elsif( $format =~ /^rt$/i )
    {
        $format = RPS::File::Sale::FORMAT_TETHERED;
    }
    else
    {
        $self->fail( "Unknown format type '$format'" );
    }
    return $format;
}

sub mediaType
{
    my $self = shift;
    my $media = $self->_getByFieldName( 'productType' ) || return;

    if( $media =~ /^audio$/i )
    {
        $media = RPS::DB::Item::MediaType::kMediaTypeAudio;
    }
    else
    {
        $self->fail( "Unknown to determine media type from product type '$media'" );
    }

    return $media;
}

sub _normalizeDate
{
    my $self = shift;
    my $dt = shift;
    #             YEAR   MON    DAY
    if( $dt =~ /(\d{4})(\d{2})(\d{2})/ )
    {
        $dt = join("-",  $1, $2, $3 );
    }
    return $dt;
}

sub price
{
    my $self = shift;

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

    $self->fail( "Unable to determine distribution fee" ) unless( $self->{_distFee} );
    
    my $distFee = $self->{_distFee};
    $distFee = (100 - $distFee) * .01;

    $price *= $distFee;

    return $price;
}

sub serviceID
{
    my $self = shift;
    return $self->{_serviceID};
}

sub _preProcess
{
    my $self = shift;
    my %args = @_;

    Log->info( "Starting _preProcess" );
    $self->SUPER::_preProcess(%args);

    my $lookForDates; # set once we find the first header

    # Scan the entire file.  Extract the admin fee (located in the footer)
    # along with the date begin/end information (located in the header).
    #
    foreach my $line(@{ $args{lines} })
    {
        $self->{line} = $line;

        # Look for the distribution fee, located in the footer
        #
        my $distFee = $self->_getByFieldName('distFee');
        
        if ($distFee =~ /LESS Merlin ADMIN FEE \((.+?)%\)/)
        {    
            $self->{_distFee} = $1;
            last;
        }


        # Look for the date begin/end and service information, located
        # in the "first header".
        #
        my $sdate   = $self->_getByFieldName('dateBegin');
        my $edate   = $self->_getByFieldName('dateEnd');
        my $service = $self->_getByFieldName('serviceID');

        if( $sdate =~ /StartDate/i )
        {
            $lookForDates = 1;
        }
        elsif( $lookForDates && !$self->{_dateBegin} && !$self->{_dateEnd} && !$self->{_serviceID} )
        {
            $self->{_dateBegin} = $self->_normalizeDate( $sdate );
            $self->{_dateEnd}   = $self->_normalizeDate( $edate );

            my $serviceID = $self->getServiceID(lc ($service)) || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $service };
            $self->fail( "Unable to determine service id from '$service'" ) unless( $serviceID );
            $self->{_serviceID} = $serviceID;
        }

    }
}

# Method _processLine is overloaded so we can detect blank detail lines
#
# See Import::Importer under sale_import/lib.
#
sub _processLine
{
    my $self = shift;

    my $labelName = $self->line->[$self->_getOffset( 'labelName' )];

    # Process line if there's data defined
    #
    if( $labelName && $labelName =~ /\S/ ) {
        return $self->SUPER::_processLine(@_);
    }

    # Otherwise we skip blank lines.
}


# Methods _getDateBegin and _getDateEnd are overloaded so that we can use
# the date information extracted from the header, rather than the dates
# from each detail line.
#
# See Import::Importer under sale_import/lib.
#
sub _getDateBegin
{
    my $self = shift;
    return $self->{_dateBegin};
}

sub _getDateEnd
{
    my $self = shift;
    return $self->{_dateEnd};
}

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