package RPS::Import::Merlin::v7;

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 {
    {
        dateBegin   => 'C', 
        dateEnd     => 'D',                      
        serviceID   => 'E',
        countryCode => 'F',
        formatType  => 'G',
        productType => 'I',
        mediaType   => 'I',
        units       => 'J',
        isrc        => 'K',
        upc         => 'L',
        artistName  => 'N',
        trackName   => 'O',
        albumName   => 'P',
        labelName   => 'Q',
        price       => 'AE',
    }
}

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

sub currencyCode { 'USD' }

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

    if( $type =~ /^track$/i )
    {
        $type = RPS::File::Sale::TYPE_TRACK;
    }
    elsif( $type =~ /^bundle$/i )
    {
        $type = RPS::File::Sale::TYPE_ALBUM;
    }
    else
    {
        $self->fail( "Unknown product type '$type'" );
    }

    return $type;
}

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

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

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

    if( $media =~ /^track|bundle$/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;
    #             DAY     MON      YEAR
    if( $dt =~ /(\d{2})\/(\d{2})\/(\d{2})/ )
    {
        $dt = join("-",  "20" . $3, $2, $1 );
    }
    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;
    my $service = $self->_getByFieldName('serviceID');

    $self->fail( "Service name not defined" ) unless( $service );
    
    my $serviceID = $self->getServiceID(lc ($service)) || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $service };

    $self->fail( "Unable to determine service id from '$service'" ) unless( $serviceID );

    return $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 information, located
        # in the "first header".
        #
        my $sdate = $self->_getByFieldName('dateBegin');
        my $edate = $self->_getByFieldName('dateEnd');

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

        
    }
}

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