package RPS::Import::Sony::v5;

use strict;

use lib '/app/tools/common/lib';
use Common::Date;
use Common::Assert;

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

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

use Data::Dumper;

sub _fieldMap {
    {
        # Header
        currencyCode     => 'F',

        # Data
        serviceID        => 'B',
        countryCode      => 'I',
        dateBegin        => 'K',
        dateEnd          => 'K',
        productType      => 'J',
        formatType       => 'L',
        artistName       => 'E',
        upc              => 'C',
        albumName        => 'D',
        isrc             => 'F',
        trackName        => 'G',
        units            => 'AA',
        price            => 'AD',
    }
}


sub _headerIdentifier { (albumName => 'Product Title') }

sub units {
    my $self = shift;
    my $_units = $self->_getByFieldName('units');
    my $_price = $self->_getByFieldName('price');

    # Making units follow the sign of the revenue
    if ( ($_price < 0 && $_units > 0) || ($_price > 0 && $_units < 0) ) {
        $_units *= -1;
    }
    
    return $_units;
}

sub _isValidSaleRecord {
    my $self = shift;

    return ( defined($self->units) && ($self->trackName || $self->albumName || $self->artistName || $self->upc ) );
}

# _productTypes returns a hashref that contains the RPS format,
# product and media mappings that correlate to the 'type' field.
# Although we use two columns (productType and formatType) to determine
# the mappings, we still return a hashref with a single key (the product
# type).  See _getBySaleType (defined elsewhere in this module) for
# more information.
#
sub _productTypes {
    my $self = shift;

    my $type   = lc($self->_getByFieldName('productType')) || return;
    my $format = lc($self->_getByFieldName('formatType')) || return;

    my $result;

    if( $type eq 'audio lp' ) {
        $result = $format eq 'mobile' ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_ALBUM,
            }

            : $format eq 'online' && $self->trackName ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'online' ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_ALBUM,
            }

            : $format eq 'physical retail' ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_ALBUM,
            }

            : $format eq 'subscription' ?
            {
                formatType => RPS::File::Sale::FORMAT_STREAM,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_ALBUM,
            }

            : $format eq 'brkg-subscript' ?
            {
                formatType => RPS::File::Sale::FORMAT_STREAM,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_ALBUM,
            }
            
            : $format eq 'brkg-online' ?
            {
                formatType => RPS::File::Sale::FORMAT_STREAM,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_ALBUM,
            }            

            : undef;
    }

    elsif( $type eq 'audtrack' ) {
        $result = $format eq 'd2c-dig' ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'mobile' ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'online' ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'physical retail' ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'subscription' ?
            {
                formatType => RPS::File::Sale::FORMAT_STREAM,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'brkg-online' ?
            {
                formatType => RPS::File::Sale::FORMAT_STREAM,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'brkg-mobile' ?
            {
                formatType => RPS::File::Sale::FORMAT_RINGTONE,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'brkg-subscript' ?
            {
                formatType => RPS::File::Sale::FORMAT_STREAM,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'locker-download' ?
            {
                formatType => RPS::File::Sale::FORMAT_STREAM,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'locker-stream' ?
            {
                formatType => RPS::File::Sale::FORMAT_STREAM,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'dl-condi' ?
            {
                formatType => RPS::File::Sale::FORMAT_TETHERED,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'brkg-con' ? # FB9011
            {
                formatType => RPS::File::Sale::FORMAT_TETHERED,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'ephemera' ? # FB18565
            {
                formatType => RPS::File::Sale::FORMAT_PERFORMANCE,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }            

            : undef
    }
    elsif( $type eq 'vidlp' ) {
        $result = $format eq 'online' ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeVideo,
                productType => RPS::File::Sale::TYPE_ALBUM,
            }
            
            : $format eq 'subscription' ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_ALBUM,
            }            
            
            : undef
    }
    elsif( $type eq 'audbndle' ) {
        $result = $format eq 'subscription' ?
            {
                formatType => RPS::File::Sale::FORMAT_STREAM,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeVideo,
                productType => RPS::File::Sale::TYPE_TRACK,
            }
            : undef
    }

    elsif( $type eq 'bundle' ) {
        $result = $format eq 'online' && $self->trackName ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'online' ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_ALBUM,
            }

            : undef;
    }

    elsif( $type eq 'ringback' ) {
        $result = $format eq 'brkg-mobile' ?
            {
                formatType => RPS::File::Sale::FORMAT_RINGTONE,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'mobile' ?
            {
                formatType => RPS::File::Sale::FORMAT_RINGTONE,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'subscription' ?
            {
                formatType => RPS::File::Sale::FORMAT_RINGTONE,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : undef;
    }


    elsif( $type eq 'ringtone' ) {
        $result = $format eq 'brkg-mobile' ?
            {
                formatType => RPS::File::Sale::FORMAT_RINGTONE,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'mobile' ?
            {
                formatType => RPS::File::Sale::FORMAT_RINGTONE,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'online' ?
            {
                formatType => RPS::File::Sale::FORMAT_RINGTONE,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'subscription' ?
            {
                formatType => RPS::File::Sale::FORMAT_RINGTONE,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'brkg-con' ? # FB9011
            {
                formatType => RPS::File::Sale::FORMAT_RINGTONE,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeAudio,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : undef;
    }

    elsif( $type eq 'vidtone' ) {
        $result = $format eq 'mobile' ?
            {
                formatType => RPS::File::Sale::FORMAT_RINGTONE,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeVideo,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'brkg-mobile' ?
            {
                formatType => RPS::File::Sale::FORMAT_RINGTONE,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeVideo,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : undef;
    }

    elsif( $type eq 'vidtrack' ) {
        $result = $format eq 'brkg-subscript' ?
            {
                formatType => RPS::File::Sale::FORMAT_STREAM,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeVideo,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'online' ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeVideo,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'other' ?
            {
                formatType => RPS::File::Sale::FORMAT_STREAM,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeVideo,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'subscription' ?
            {
                formatType => RPS::File::Sale::FORMAT_STREAM,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeVideo,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'mobile' ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeVideo,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'locker-download' ?
            {
                formatType => RPS::File::Sale::FORMAT_STREAM,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeVideo,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'brkg-online' ?
            {
                formatType => RPS::File::Sale::FORMAT_DOWNLOAD,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeVideo,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : $format eq 'dl-condi' ? # FB9011
            {
                formatType => RPS::File::Sale::FORMAT_TETHERED,
                mediaType => RPS::DB::Item::MediaType::kMediaTypeVideo,
                productType => RPS::File::Sale::TYPE_TRACK,
            }

            : undef;
    }

    return { $type => $result }
}

sub _getDateBegin {
    my $self = shift;
    my $date = $self->SUPER::_getDateBegin() || return;

    my $d = new Common::Date( $date );
    return $d->halfBegin;
}

sub _getDateEnd {
    my $self = shift;
    my $date = $self->SUPER::_getDateEnd() || return;

    my $d = new Common::Date( $date );
    return $d->halfEnd;
}

sub currencyCode { shift->{_currencyCode} }

sub countryCode {
    my $self = shift;
    my $country = $self->SUPER::countryCode();

    my %countryMap = (
        'rep. korea'     => 'KR',
        'slovakia rep.'  => 'SK',
        'arab emirates'  => 'AE',
        'dominican rep.' => 'DO',
        'st. lucia'      => 'LC',
        'antigua & barbu' => 'AG',
    );

    $country = $countryMap{lc $country} if( exists $countryMap{lc $country} );

    my $c = new Common::Country( search => $country );
    return $c->alpha2() if( $c );

    return $country;  # Return original name and let MapFace deal with it
}

sub _processHeader {
    my $self = shift;

    $self->SUPER::_processHeader();

    my $currencyCode = $self->SUPER::currencyCode || return;

    return if( $self->{_currencyCode} );

    $self->{_currencyCode} = $currencyCode if( $currencyCode =~ /^\w{3}$/ );
}

# _getBySaleType - overridden here to use a different fieldname so that we
# can use MapFace with this importer.  The original method can be found in
# sale_import/lib/Import/Importer.pm.
#
# This method is used by the productType, formatType and mediaType accessors
# defined here and in the Importer base class (RPS/Importer.pm).
# In the base class, those methods call _getBySaleType with a specific field:
#
#   sub mediaType             { shift->_getBySaleType( 'mediaType' ) }
#   sub productType           { shift->_getBySaleType( 'productType' ) }
#   sub formatType            { shift->_getBySaleType( 'formatType' ) }
#
sub _getBySaleType {
    my $self = shift;
    my $field = shift;

    assert( $field, "Field required" );

    my $type = lc($self->_getByFieldName( 'productType' )) || return;  # use 'productType' instead of 'type'

    my $map = $self->_productTypes() || return;

    return $map->{$type} ? $map->{$type}->{$field} : undef;
}

# We also extend the productType, formatType and mediaType accessors
# so that we can log MapFace errors.
#
sub productType {
    my $self = shift;
    my $type = $self->SUPER::productType(@_);

    return $type if( $type );

    return $self->handleError("Unable to determine product type", RPS::DB::Item::SaleImportError::kErrorProductType );
}

sub formatType {
    my $self = shift;
    my $type = $self->SUPER::formatType(@_);

    return $type if( $type );

    return $self->handleError("Unable to determine format type", RPS::DB::Item::SaleImportError::kErrorFormatType );
}

sub mediaType {
    my $self = shift;
    my $type = $self->SUPER::mediaType(@_);

    return $type if( $type );

    return $self->handleError("Unable to determine media type", RPS::DB::Item::SaleImportError::kErrorMediaType );
}

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

    # Default to Sony if blank
    return Client::Service::DSP_SONY unless( $service );

    my $serviceID = $self->getServiceID(lc ($service)) || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $service };

    return $serviceID if( $serviceID );

    return $self->handleError("Unknown service '$service'", RPS::DB::Item::SaleImportError::kErrorService );
}

#####    MapFace    #####
#

sub _mapFaceServiceID {
    return('serviceID');
}

sub _mapFaceCountryCode {
    return('countryCode');
}

sub _mapFaceProductType {
    return('productType', 'formatType');
}

sub _mapFaceFormatType {
    return('productType', 'formatType');
}

sub _mapFaceMediaType {
    return('productType', 'formatType');
}

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