package RPS::Import::Sony::v33;

use strict;
use warnings;

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

my %typesMap = (
    'digital audio longplay' => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'digital audio snippet'  => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'digital audio track'    => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    'digital video longform' => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'digital video track'    => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    'mastertone'             => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
);

sub _fieldMap {
    {
        dateBegin        => 'F8',
        dateEnd          => 'G8',
        countryCode      => 'I',
        productType      => 'D',
        formatType       => 'J',
        serviceProductID => 'A',
        artistName       => 'C',
        albumName        => 'B',
        isrc             => 'H',
        trackName        => 'B',
        units            => 'O',
        price            => 'T',
        mediaType        => 'D',
        serviceID        => 'M',
    };
}

sub currencyCode      { 'AUD' }
sub _headerIdentifier { units => 'Units' }

sub saleDates {
    my $self = shift;

    my $startDate = $self->_getDateBegin();
    my $endDate   = $self->_getDateEnd();

    return $self->_getDates( date_begin => $startDate, date_end => $endDate );
}

sub countryCode {
    my $self    = shift;

    my $country = $self->_getByFieldName('countryCode') || '';
    my $oCountry = Common::Country->new( search => $country );
    return $oCountry->alpha2() if $oCountry;

    $self->fail("Unable to determine country code from '$country'");
}

sub productType {
    my $self = shift;

    my $type = lc($self->_getByFieldName('productType') || '');
    return $typesMap{$type}->{product_type} if exists $typesMap{$type};

    $self->fail("Unable to get product type from '$type'");
}

sub mediaType {
    my $self = shift;

    my $type = lc($self->_getByFieldName('mediaType') || '');
    return $typesMap{$type}->{media_type} if exists $typesMap{$type};

    $self->fail("Unable to get media type from: '$type'");
}


sub formatType {
    my $self = shift;

    my $formatType  = uc($self->_getByFieldName('formatType') || '');
    my $productType = $self->_getByFieldName('productType')   || '';

    my %formatsMap = (
        'CDS' => RPS::File::Sale::FORMAT_STREAM,
        'DAS' => RPS::File::Sale::FORMAT_STREAM,
        'DBA' => RPS::File::Sale::FORMAT_STREAM,
        'DBC' => RPS::File::Sale::FORMAT_DOWNLOAD,
        'DBL' => RPS::File::Sale::FORMAT_DOWNLOAD,
        'DBP' => RPS::File::Sale::FORMAT_STREAM,
        'DBT' => RPS::File::Sale::FORMAT_DOWNLOAD,
        'DCD' => RPS::File::Sale::FORMAT_DOWNLOAD,
        'DLK' => RPS::File::Sale::FORMAT_DOWNLOAD,
        'DLS' => RPS::File::Sale::FORMAT_STREAM,
        'DOL' => RPS::File::Sale::FORMAT_DOWNLOAD,
        'DPS' => RPS::File::Sale::FORMAT_STREAM,
        'DSA' => RPS::File::Sale::FORMAT_STREAM,
        'DSC' => RPS::File::Sale::FORMAT_DOWNLOAD,
        'DSP' => RPS::File::Sale::FORMAT_STREAM,
        'DTS' => $productType =~ /^mastertone$/i
                    ? RPS::File::Sale::FORMAT_RINGTONE
                    : RPS::File::Sale::FORMAT_DOWNLOAD,
    );

    return $formatsMap{$formatType} if exists $formatsMap{$formatType};

    $self->fail("Unable to get format type from '$formatType'");
}

sub albumName {
    my $self = shift;

    my $productType = $self->productType;
    if ( $productType && $productType eq RPS::File::Sale::TYPE_ALBUM ) {
        return $self->_getByFieldName('albumName');
    }

    return;
}

sub trackName {
    my $self = shift;

    my $productType = $self->productType;
    if ( $productType && $productType eq RPS::File::Sale::TYPE_TRACK ) {
        return $self->_getByFieldName('trackName');
    }

    return;
}

sub _processSheet {
    my ($self, $sheet, $sheetnum) = @_;
    return unless $self->{sheetname} =~ /^sheet\s?1$/i;

    return $self->RPS::Import::Importer::_processSheet( $sheet, $sheetnum );
}

sub serviceID {
    my $self = shift;

    my $service = $self->_getByFieldName('serviceID');
    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' );
}

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

sub _mapFaceMediaType {
    return ( 'mediaType' );
}


1;
