package RPS::Import::Redeye::v10;

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use RPS::File::Sale;

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

sub _fieldMap {
    my $self = shift;

    my %fieldMap = (
        10 => {
            countryCode  => 'P',
            dateBegin    => 'I',
            dateEnd      => 'I',
            productType  => 'A',
            artistName   => 'D',
            upc          => 'C',
            albumName    => 'E',
            sales        => 'F',
            units        => 'F',
            totalRevenue => 'M',
        },
        13 => {
            countryCode  => 'Q',
            dateBegin    => 'I',
            dateEnd      => 'I',
            productType  => 'A',
            artistName   => 'D',
            upc          => 'C',
            albumName    => 'E',
            sales        => 'F',
            units        => 'F',
            totalRevenue => 'O',
        },
        14 => {
            countryCode  => 'Q',
            dateBegin    => 'I',
            dateEnd      => 'I',
            productType  => 'A',
            artistName   => 'D',
            upc          => 'C',
            albumName    => 'E',
            sales        => 'F',
            units        => 'F',
            totalRevenue => 'O',
        },
        15 => {
            labelName    => 'F',
            countryCode  => 'R',
            dateBegin    => 'J',
            dateEnd      => 'J',
            productType  => 'A',
            artistName   => 'D',
            upc          => 'C',
            albumName    => 'E',
            sales        => 'G',
            units        => 'G',
            totalRevenue => 'P',
        },
        17 => {
            labelName    => 'G',
            countryCode  => 'S',
            dateBegin    => 'K',
            dateEnd      => 'K',
            productType  => 'B',
            artistName   => 'E',
            upc          => 'D',
            albumName    => 'F',
            sales        => 'H',
            units        => 'H',
            totalRevenue => 'Q',
        },
    );

    return $fieldMap{ $self->version };
}

sub _unverifiedFieldMap {
    my $self = shift;

    my %fieldMap = (
        10 => {
           distFee        => 'L',
           returnReserved => 'N',
        },
        13 => {
           distFee        => 'L',
           returnReserved => 'N',
        },
        14 => {
           distFee        => 'L',
           returnReserved => 'N',
           _title         => 'E',
        },
        15 => {
           distFee        => 'L',
           returnReserved => 'N',
           _title         => 'E',
        },
        17 => {
           distFee        => 'N',
           returnReserved => 'P',
           _title         => 'F',
        },
    );

    return $fieldMap{ $self->version };
}

sub physical          { 1 }
sub _headerIdentifier { upc => 'UPC' }
sub channel           { RPS::File::Sale::CHANNEL_RETAIL; }
sub priceLevel        { RPS::File::Sale::PLEVEL_UNKNOWN; }
sub currencyCode      { 'USD' }

sub free {
    my $self = shift;

    return unless $self->_version =~ /^(14|15|17)$/;
    my $title = $self->_getByFieldName('_title') || '';
    if ( $title =~ /\bPROMO\b/i && $self->units && !$self->totalRevenue ) {
        return 1;
    }

    return 0;
}

sub saleDates {
    my $self = shift;

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

    # default format is iso: 2010-10-01
    my $type = "iso";
    if ( my ($d, $m, $y) = $dateBegin =~ /^(\d{1,2})[\/.](\d{1,2})[\/.](?:20)?(\d{2})$/ ) {
        ($d, $m) = ($m, $d) if $self->version =~ /^14|15$/ || $m > 12;
        $dateBegin = sprintf "20%02d-%02d-%02d", $y, $m, $d;
    }

    return $self->_getDates( date_begin => $dateBegin, type => $type );
}

sub productType {
    my $self = shift;

    my $type = $self->_getByFieldName('productType') || '';

    if ( $type =~ /^(PCD|CD|ZN)-/i ) {
        return RPS::File::Sale::TYPE_CD;
    } elsif ( $type =~ /^(M?LP|BOX)-/i ) {
        return RPS::File::Sale::TYPE_LP;
    } elsif ( $type =~ /^DVD-/i ) {
        return RPS::File::Sale::TYPE_DVD;
    } elsif ( $type =~ /^CS-/i ) {
        return RPS::File::Sale::TYPE_CASS;
    } elsif ( $type =~ /^SI-/i ) {
        return RPS::File::Sale::TYPE_LP5;
    }

    $self->fail("Could not get product type from '$type'");
}

sub upc {
    my $self = shift;

    my $upc = $self->_getByFieldName('upc') || 0;
    return sprintf "%d", $upc;
}

sub netUnits           { $_[0]->_getByFieldName('sales') || 0 }
sub sales              { $_[0]->netUnits     > 0 ? $_[0]->netUnits         : 0 }
sub salesRevenue       { $_[0]->totalRevenue > 0 ? $_[0]->totalRevenue     : 0 }
sub returns            { $_[0]->netUnits     < 0 ? abs $_[0]->netUnits     : 0 }
sub returnsRevenue     { $_[0]->totalRevenue < 0 ? abs $_[0]->totalRevenue : 0 }

sub totalRevenue {
    my $self = shift;

    my $totalRevenue   = $self->_getByFieldName('totalRevenue')   || 0;
    my $returnReserved = $self->_getByFieldName('returnReserved') || 0;
    my $distFee        = $self->_getByFieldName('distFee')        || 0;

    $totalRevenue =~ s/,//g;

    return $distFee ? $totalRevenue : $totalRevenue - $returnReserved;
}

sub _isValidSaleRecord {
    my $self = shift;

    my $sales = $self->_getByFieldName('sales');
    my $totalRevenue = $self->_getByFieldName('totalRevenue');
    $self->fail("Detected revenue without sales or returns") if ( !$sales && $totalRevenue);
    return $self->albumName && $sales;
}

1;
