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