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