package RPS::Import::CadencePhysical;

use strict;

use Date::Calc qw(Days_in_Month);


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

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

sub _fieldMap {
    {
        dateBegin    => 'A',
        productType  => 'L',
        albumName    => 'L',
        artistName   => 'K',
        upc          => 'G',
        serviceProductID => 'J',

        sales        => 'B',
        returns      => 'D',
        totalRevenue => 'I',
    }
}

sub _headerIdentifier { ( upc => 'upc' ) }
sub countryCode  { 'CA' }
sub currencyCode { 'CAD' }
sub physical     { 1 }
sub channel      { RPS::File::Sale::CHANNEL_RETAIL; }
sub priceLevel   { RPS::File::Sale::PLEVEL_FULL }

sub saleDates {
    my $self = shift;
    my $dt = $self->_getByFieldName('dateBegin');

    my $dateBegin;
    my $dateEnd;

    if( $dt =~ /^(\d{4})(\d{2})$/ ) # YYYYMM
    {
        my $year = $1;
        my $month = $2;
        $dateBegin = sprintf("%04d-%02d-%02d", $year, $month, 1);
        $dateEnd   = sprintf("%04d-%02d-%02d", $year, $month, Days_in_Month($year, $month));
    }
    else
    {
        ($dateBegin, $dateEnd ) = $self->_getDates( date_begin => $dt );
    }
    return ($dateBegin, $dateEnd);
}

sub _getAlbumConfig {
    my $self = shift;
    my $title = $self->_getByFieldName('albumName');
    my $albumName;
    my $type = RPS::File::Sale::TYPE_CD;

    if( $title !~ /\(/ )
    {
        $albumName = $title;
    }
    else
    {
        $albumName = $title;
        if( $title =~ /(.+)-LP$/i )
        {
            $albumName = $1;
            $type = RPS::File::Sale::TYPE_LP;
        }
        elsif( $title =~ /(.+)\s?(\(.+\)?)/ )
        {
            $albumName = $1;
            my $_type = $2;

            if( $_type =~ /^\(CD+BOOKLET\)$/i )
            {
                # nothing to do here...
            }
            elsif( $_type =~ /^\((2|3)CD\)?$/i )
            {
                $type = RPS::File::Sale::TYPE_DBL_CD;
            }
            elsif( $_type =~ /^\(2?CD\+DVD\)$/i )
            {
                $type = RPS::File::Sale::TYPE_DVD_CD_SET;
            }
            elsif( $_type =~ /^\(7''LP/i ||
                   $_type =~ /^\(LP\+7''(LP|VYL)\)?/i ||
                   $_type =~ /^\(LP\+7""(LP|VYL)\)?/i )
            {
                $type = RPS::File::Sale::TYPE_LP5;
            }
            elsif( $_type =~ /^\((2|4)?LP.?\)?/i ||
                   $_type =~ /^\(DLX(\s4?LP)?\)?/i ||
                   $_type =~ /^\(II\)-LP/i ||
                   $_type =~ /^\(LP$/i )
            {
                $type = RPS::File::Sale::TYPE_LP;
            }

        }
    }
    return( $albumName, $type );
}

sub productType {
    my $self = shift;
    my ($albumName, $type ) = $self->_getAlbumConfig();

    return $type if( $type );

    $self->fail("Unable to get product type from $type");
}

sub albumName {
    my $self = shift;
    my ($albumName, $type ) = $self->_getAlbumConfig();
    return $albumName;
}

sub artistName {
    my $self = shift;
    my $name = $self->_getByFieldName('artistName');
    if( $name =~ /^(.+),(.+)$/ )
    {
        my($last, $first) = ($1, $2);
        $last =~ s/\s+$//;
        $first =~ s/^\s+//;
        $name = $first . " " . $last;
    }
    return $name;
}

sub _netUnits {
    my $self = shift;
    my $sales = $self->_getByFieldName('sales');
    my $returns = $self->_getByFieldName('returns');
    return $sales + $returns;
}

sub sales {
    my $self = shift;
    my $units = $self->_netUnits();
    my $revenue = $self->_getByFieldName('totalRevenue');
    return ($revenue > 0) ? abs($units) : 0;
}

sub salesRevenue {
    my $self = shift;
    my $revenue = $self->_getByFieldName('totalRevenue');
    return ( $revenue > 0 ) ? $revenue : 0;
}

sub returns {
    my $self = shift;
    my $units = $self->_netUnits();
    my $revenue = $self->_getByFieldName('totalRevenue');
    return ($revenue < 0) ? abs($units) : 0;
}

sub returnsRevenue {
    my $self = shift;
    my $revenue = $self->_getByFieldName('totalRevenue');
    return ( $revenue < 0 ) ? abs($revenue) : 0;
}

sub _isValidSaleRecord {
    my $self = shift;
    my $albumName  = $self->_getByFieldName('albumName');
    my $revenue = $self->_getByFieldName('totalRevenue');

    return ( $albumName && $revenue );
}

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