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