package RPS::Import::SelectPhysical;

use strict;

use Data::Dumper;
use lib '/app/tools/common/lib';
use Common::Util qw(normalize_upc normalize_isrc);
use Date::Calc qw(Days_in_Month);

use lib '/app/tools/data_classes/lib';

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

sub _headerIdentifier { ( dateBegin => /^(?:PERIODE DE|PER. FROM)$/ ) }
sub physical { 1 }

sub _fieldMap {
    my $self = shift;

    my %fieldMap = (
        1 => {
            dateBegin        => 'P',
            dateEnd          => 'Q',
            productType      => 'E',
            artistName       => 'C',
            serviceProductID => 'A',
            albumName        => 'D',
            wholesalePrice   => 'G',
            retailPrice      => 'F',
            sales            => 'X',
            returns          => 'X',
            totalRevenue     => 'Z',
        },
        2 => {
            dateBegin        => 'Q',
            dateEnd          => 'R',
            productType      => 'F',
            artistName       => 'D',
            serviceProductID => 'A',
            upc              => 'B',
            albumName        => 'E',
            wholesalePrice   => 'H',
            retailPrice      => 'G',
            sales            => 'Y',
            returns          => 'Y',
            totalRevenue     => 'AA',
        },
        3 => {
            dateBegin      => 'P',
            dateEnd        => 'Q',
            productType    => 'E',
            artistName     => 'C',
            albumName      => 'D',
            wholesalePrice => 'G',
            retailPrice    => 'F',
            sales          => 'X',
            salesRevenue   => 'Z',
            returns        => 'X',
            returnsRevenue => 'Z',
            totalRevenue   => 'Z',
            mediaType      => 'E',
        },
    );

    return $fieldMap{ $self->_version() };
}

sub _unverifiedFieldMap {
    my $self = shift;

    my %fieldMap = (
        1 => {
            promoUnits => 'S',
            freeUnits  => 'T',
        },
        2 => {
            promoUnits => 'T',
            freeUnits  => 'U',
        },
        3 => {
            promoUnits => 'S',
            freeUnits  => 'T',
        },
    );

    return $fieldMap{ $self->_version() };
}

sub channel      { RPS::File::Sale::CHANNEL_RETAIL }
sub priceLevel   {
    my $self = shift;

    if ( $self->_version == 3 ) {
        my $freeUnits  = ( $self->_getByFieldName('freeUnits')  || 0 ) * 1;
        my $promoUnits = ( $self->_getByFieldName('promoUnits') || 0 ) * 1;
        return RPS::File::Sale::PLEVEL_PROMO if $freeUnits || $promoUnits;
    }

    return RPS::File::Sale::PLEVEL_FULL;
}
sub countryCode  { 'CA' }
sub currencyCode { 'CAD' }

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

    if ( $productType =~ /12 POUCES/i ) {
        return RPS::File::Sale::TYPE_LP;
    } elsif ( $productType =~ /MICROSILLON/i ) {
        return RPS::File::Sale::TYPE_LP;
    }

    #elsif( $productType =~ /LIVRE/i )
    #{
    #    return RPS::File::Sale::TYPE_BOOK;
    #}
    elsif ( $productType =~ /45 TOURS/i ) {
        return RPS::File::Sale::TYPE_LP5;
    } elsif ( $productType =~ /COMPACT DISC/i ) {
        return RPS::File::Sale::TYPE_CD;
    } elsif ( $productType =~ /DVD\/CD/i ) {
        return RPS::File::Sale::TYPE_DVD_CD_SET;
    }

    $self->fail("Unknown product type $productType ");
}

sub sales {
    my $self  = shift;
    my $sales = $self->_getByFieldName('sales');
    $sales = $self->_formatUnits($sales);

    return ( $sales > 0 ) ? $sales : 0;
}

sub salesRevenue {
    my $self    = shift;
    my $revenue = $self->totalRevenue;

    return ( $revenue > 0 ) ? $revenue : 0;
}

sub returns {
    my $self    = shift;
    my $returns = $self->_getByFieldName('returns');
    $returns = $self->_formatUnits($returns);

    return ( $returns < 0 ) ? abs($returns) : 0;
}

sub returnsRevenue {
    my $self    = shift;
    my $revenue = $self->totalRevenue;

    return ( $revenue < 0 ) ? abs($revenue) : 0;
}

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

    return $revenue;
}

sub wholesalePrice {
    my $self  = shift;
    my $price = $self->_getByFieldName('wholesalePrice');
    $price = $self->_formatRevenue($price);

    return $price;
}

sub retailPrice {
    my $self  = shift;
    my $price = $self->_getByFieldName('retailPrice');
    $price = $self->_formatRevenue($price);

    return $price;
}

sub _saveLine {
    my $self = shift;

    # We may need to save three lines to the database for one line in the file.
    # One for regular units, one for promo units, and one for free units.
    if ( $self->sales != 0 || $self->returns != 0 ) {

        # This is for the regular units
        $self->SUPER::_saveLine();
    }

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

    if ( $promoUnits != 0 ) {
        $promoUnits = $self->_formatUnits($promoUnits);

        my ( $startDate, $endDate ) = $self->saleDates();

        my $sale = RPS::Import::SaleRec->new();

        $sale->units($promoUnits);
        $sale->price(0);

        if ( $promoUnits < 0 ) {
            $sale->returns( abs($promoUnits) );
            $sale->sales(0);
        } else {
            $sale->returns(0);
            $sale->sales($promoUnits);
        }

        $sale->salesRevenue(0);
        $sale->returnsRevenue(0);
        $sale->totalRevenue(0);

        $sale->priceLevel(RPS::File::Sale::PLEVEL_PROMO);

        $sale->dateBegin($startDate);
        $sale->dateEnd($endDate);

        $sale->mediaType( $self->mediaType );
        $sale->productType( $self->productType );
        $sale->formatType( $self->formatType );
        $sale->albumName( $self->albumName );
        $sale->artistName( $self->artistName );
        $sale->averagePrice( $self->averagePrice );
        $sale->channel( $self->channel );
        $sale->clientProductID( $self->clientProductID );
        $sale->configuration( $self->configuration );
        $sale->conversionRate( $self->conversionRate );
        $sale->countryCode( $self->countryCode );
        $sale->currencyCode( $self->currencyCode );
        $sale->free( $self->free );
        $sale->importStatus( $self->importStatus );
        $sale->isrc( $self->isrc );
        $sale->labelName( $self->labelName );
        $sale->outlet( $self->outlet );
        $sale->payoutType( $self->payoutType );
        $sale->wholesalePrice( $self->wholesalePrice );
        $sale->retailPrice( $self->retailPrice );
        $sale->priceType( $self->priceType );
        $sale->retail( $self->retail );
        $sale->serviceID( $self->serviceID );
        $sale->serviceProductID( $self->serviceProductID );
        $sale->trackName( $self->trackName );
        $sale->trackNum( $self->trackNum );
        $sale->upc( $self->upc );
        $sale->wholesaleRate( $self->wholesaleRate );
        $sale->mcps_adjustment( $self->mcps_adjustment );
        $sale->comments( $self->comments );

        $sale->lineNum( $self->linenum );

        $self->_insertSale( sale => $sale );
    }

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

    if ( $freeUnits != 0 ) {
        $freeUnits = $self->_formatUnits($freeUnits);

        my ( $startDate, $endDate ) = $self->saleDates();

        my $sale = RPS::Import::SaleRec->new();

        $sale->units($freeUnits);
        $sale->price(0);

        if ( $freeUnits < 0 ) {
            $sale->returns( abs($freeUnits) );
            $sale->sales(0);
        } else {
            $sale->returns(0);
            $sale->sales($freeUnits);
        }

        $sale->salesRevenue(0);
        $sale->returnsRevenue(0);
        $sale->totalRevenue(0);

        $sale->free(1);

        $sale->priceLevel(RPS::File::Sale::PLEVEL_PROMO);

        $sale->dateBegin($startDate);
        $sale->dateEnd($endDate);

        $sale->mediaType( $self->mediaType );
        $sale->productType( $self->productType );
        $sale->formatType( $self->formatType );
        $sale->albumName( $self->albumName );
        $sale->artistName( $self->artistName );
        $sale->averagePrice( $self->averagePrice );
        $sale->channel( $self->channel );
        $sale->clientProductID( $self->clientProductID );
        $sale->configuration( $self->configuration );
        $sale->conversionRate( $self->conversionRate );
        $sale->countryCode( $self->countryCode );
        $sale->currencyCode( $self->currencyCode );
        $sale->importStatus( $self->importStatus );
        $sale->isrc( $self->isrc );
        $sale->labelName( $self->labelName );
        $sale->outlet( $self->outlet );
        $sale->payoutType( $self->payoutType );
        $sale->wholesalePrice( $self->wholesalePrice );
        $sale->retailPrice( $self->retailPrice );
        $sale->priceType( $self->priceType );
        $sale->retail( $self->retail );
        $sale->serviceID( $self->serviceID );
        $sale->serviceProductID( $self->serviceProductID );
        $sale->trackName( $self->trackName );
        $sale->trackNum( $self->trackNum );
        $sale->upc( $self->upc );
        $sale->wholesaleRate( $self->wholesaleRate );
        $sale->mcps_adjustment( $self->mcps_adjustment );
        $sale->comments( $self->comments );

        $sale->lineNum( $self->linenum );

        $self->_insertSale( sale => $sale );
    }
}

sub _isValidSaleRecord {
    my $self = shift;

    my $promoUnits   = $self->_getByFieldName('promoUnits');
    my $freeUnits    = $self->_getByFieldName('freeUnits');
    my $regularUnits = $self->_getByFieldName('sales');
    my $revenue      = $self->totalRevenue;

    return ( $regularUnits || $promoUnits || $freeUnits || $revenue );
}

sub _formatUnits {
    my ( $self, $units ) = @_;

    if ( $units =~ /^- (\d+)$/ ) {
        $units = $1 * -1;
    }

    return $units;
}

sub _formatRevenue {
    my ( $self, $revenue ) = @_;

    if ( $revenue =~ /^- (\d+),(\d{2})$/ ) {
        $revenue = $1 . "." . $2;
        $revenue *= -1;
    } elsif ( $revenue =~ /^(\d+),(\d{2})$/ ) {
        $revenue = $1 . "." . $2;
    }

    return $revenue;
}

sub mediaType {
    my $self = shift;

    return $self->SUPER::mediaType unless $self->_version == 3;

    my $type = $self->_getByFieldName('mediaType') || '';
    return RPS::DB::Item::MediaType::kMediaTypeVideo if $type =~ /^DVD\/CD$/i;

    return RPS::DB::Item::MediaType::kMediaTypeAudio;
}

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