#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# Copyright (C) 2014 RoyaltyShare, Inc.   All Rights Reserved
#---------------------------------------------------------------
package RPS::Import::ThirtyTigers::v2;

use strict;

use Date::Calc qw(Days_in_Month Decode_Month);

use lib '/app/tools/rps/lib';

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

sub _fieldMap {
    my $self      = shift;
    my $sheetType = $self->{_sheetType};

    my %field_map = (
        'EU' => {
            labelName    => 'A',
            countryCode  => 'E',
            dateBegin    => 'F',
            dateEnd      => 'F',
            artistName   => 'B',
            albumName    => 'C',
            upc          => 'I',
            totalRevenue => 'N',
        },
        'NA' => {
            labelName      => 'A',
            countryCode    => 'B',
            artistName     => 'C',
            upc            => 'G',
            albumName      => 'D',
            sales          => 'I',
            salesRevenue   => 'J',
            returns        => 'K',
            returnsRevenue => 'L',
            totalRevenue   => 'N',
        },
    );
    return $field_map{$sheetType};
}

sub _unverifiedFieldMap {
    my $self      = shift;
    my $sheetType = $self->{_sheetType};

    my %field_map = (
        'NA' => {
            prefix    => 'E',
            suffix    => 'F',
            catalogNo => 'H',
        },
        'EU' => {
            config     => 'J',
            catalogNo  => 'H',
            netUnits   => 'K',
            netRevenue => 'N',
        },
    );
    return $field_map{$sheetType};
}

sub _headerIdentifier { ( albumName => qr/TITLE/ ) }

sub currencyCode { 'USD'; }

sub channel { RPS::File::Sale::CHANNEL_RETAIL; }

sub priceLevel { RPS::File::Sale::PLEVEL_UNKNOWN; }

sub physical { 1; }

sub countryCode {
    my $self = shift;
    if ( exists $self->_fieldMap->{'countryCode'} ) {
        my $cname = $self->_getByFieldName('countryCode');
        my $o     = Common::Country->Get($cname);
        return ( defined $o ) ? $o->alpha2() : $cname;
    }
    return 'US';
}

sub saleDates {
    my $self = shift;
    my $dateBegin;
    my $dateEnd;

    if ( exists $self->_fieldMap->{'dateBegin'} ) {
        my $sDate = $self->_getByFieldName('dateBegin');
        my $eDate = $self->_getByFieldName('dateEnd');
        ( $dateBegin, $dateEnd ) = $self->_getDates( date_begin => $sDate, date_end => $eDate );
    } else {
        if ( !$self->{_dateBegin} ) {
            my $sheetName = $self->{sheetname};
            if ( $sheetName =~ /^(\d{2})\.(\d{2}) NA Physical$/i ) {
                my ( $month, $year ) = ( $1, $2 );
                $year += 2000;
                $dateBegin = sprintf( "%04d-%02d-%02d", $year, $month, 1 );
                $dateEnd = sprintf( "%04d-%02d-%02d", $year, $month, Days_in_Month( $year, $month ) );
            }
            $self->{_dateBegin} = $dateBegin;
            $self->{_dateEnd}   = $dateEnd;
        }
        ( $dateBegin, $dateEnd ) = ( $self->{_dateBegin}, $self->{_dateEnd} );
    }
    return ( $dateBegin, $dateEnd );
}

sub sales {
    my $self = shift;
    my $sales;
    if ( exists $self->_fieldMap->{'sales'} ) {
        $sales = $self->_getByFieldName('sales');
    } else {
        $sales = $self->_getByFieldName('netUnits');
    }
    return ( $sales > 0 ) ? $sales : 0;
}

sub salesRevenue {
    my $self = shift;
    my $salesRevenue;
    if ( exists $self->_fieldMap->{'salesRevenue'} ) {
        $salesRevenue = $self->_getByFieldName('salesRevenue');
    } else {
        $salesRevenue = $self->_getByFieldName('netRevenue');
    }
    return ( $salesRevenue > 0 ) ? $salesRevenue : 0;
}

sub returns {
    my $self = shift;
    if ( exists $self->_fieldMap->{'returns'} ) {

        # Check for returns masquerading as sales
        #
        my $sales   = $self->_getByFieldName('sales');
        my $returns = $self->_getByFieldName('returns');
        $returns = ( $sales < 0 ) ? ( $returns + $sales ) : $returns;
        return abs($returns);
    }

    my $qty = $self->_getByFieldName('netUnits');
    return ( $qty < 0 ) ? abs($qty) : 0;
}

sub returnsRevenue {
    my $self = shift;
    if ( exists $self->_fieldMap->{'returnsRevenue'} ) {

        # Check for returns masquerading as sales
        #
        my $salesRevenue   = $self->_getByFieldName('salesRevenue');
        my $returnsRevenue = $self->_getByFieldName('returnsRevenue');
        $returnsRevenue = ( $salesRevenue < 0 ) ? ( $returnsRevenue + $salesRevenue ) : $returnsRevenue;
        return abs($returnsRevenue);
    }

    my $amt = $self->_getByFieldName('netRevenue');
    return ( $amt < 0 ) ? abs($amt) : 0;
}

sub clientProductID {
    my $self      = shift;
    my $catalogNo = $self->_getByFieldName('catalogNo');
    if ( $self->{_sheetType} eq 'NA' ) {
        my $prefix = $self->_getByFieldName('prefix');
        if ( $prefix =~ /^obr$/i ) {
            $catalogNo = $self->_getByFieldName('upc');
        }
    }
    return $catalogNo;
}

sub upc {
    my $self = shift;
    my $upc  = $self->_getByFieldName('upc');
    if ( $self->{_sheetType} eq 'NA' ) {
        my $prefix = $self->_getByFieldName('prefix');
        if ( $prefix =~ /^obr$/i ) {
            $upc = $self->_getByFieldName('catalogNo');
        }
    }
    return $upc;
}

sub artistName {
    my $self = shift;
    my $name = $self->_getByFieldName('artistName');

    my $artistName = $name;

    if ( $name =~ /(\w+),\s+(.*)$/i )    # lastname, firstname
    {
        $artistName = $2 . " " . $1;
    }
    return $artistName;
}

sub productType {
    my $self = shift;
    my $type;
    if ( $self->{_sheetType} eq 'EU' ) {
        $type = $self->_getByFieldName('config');
    } elsif ( $self->{_sheetType} eq 'NA' ) {
        $type = $self->_getByFieldName('prefix');
        if ( $type =~ /^OBR$/i ) {

            # The suffix may be of the form NNNNN-XX, where XX is the config
            # we're looking for.
            #
            $type = $self->_getByFieldName('suffix');
            $type = $1 if ( $type =~ /(?:\w)+-(\w{2})$/ );
            return RPS::File::Sale::TYPE_CD if ( !$type or '' eq $type );    # default to CD if no explicit config
        }
    }

    if ( $type =~ /^CD$/i ) {
        return RPS::File::Sale::TYPE_CD;
    } elsif ( $type =~ /^LP$/i ) {
        return RPS::File::Sale::TYPE_LP;
    } elsif ( $type =~ /^(DVD|VD|DV)$/i ) {
        return RPS::File::Sale::TYPE_DVD;
    }
    return $self->fail("Unable to determine product type from '$type'");
}

sub _processSheet {
    my $self     = shift;
    my $sheet    = shift;
    my $sheetnum = shift;

    my $num = scalar @$sheet;

    # If we have a physical tab, make sure it doesn't have any lines in it.
    # if it's empty then we'll skip it and go on processing the rest of the
    # file, otherwise we'll error out.
    #
    if ( $self->{sheetname} =~ /na physical/i ) {
        $self->{_sheetType} = 'NA';
        return $self->SUPER::_processSheet( $sheet, $sheetnum );
    } elsif ( $self->{sheetname} =~ /eu physical/i ) {
        $self->{_sheetType} = 'EU';
        return $self->SUPER::_processSheet( $sheet, $sheetnum );
    } else {
        $self->fail( "Found unknown sheet '" . $self->{sheetname} . "'" );
    }
}

# We can have units from two different columns so we need to override
# _isValidSaleRecord to process lines with units in either location.
#
sub _isValidSaleRecord {
    my $self = shift;

    my $title = $self->_getByFieldName('albumName');
    my $sales;
    my $returns;

    if ( $self->{_sheetType} eq 'EU' ) {
        my $units = $self->_getByFieldName('netUnits');
        $sales   = ( $units > 0 ) ? $units : 0;
        $returns = ( $units < 0 ) ? $units : 0;
    } else {
        $sales   = $self->_getByFieldName('sales');
        $returns = $self->_getByFieldName('returns');
    }

    # line is valid if it has units and a title
    #
    return ( ( $sales || $returns ) && $title );
}

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