package RPS::Import::Sony::v37;

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use RPS::Import::ServiceMap;

use parent 'RPS::Import::MapFaceBase';
use parent 'RPS::Import::ImporterMixed';

sub physical { 2 }

sub _fieldMapExtended {
    {
        digital => {
            option1 => {
                serviceID       => 'E',
                countryCode     => 'L',
                dateBegin       => 'N',
                dateEnd         => 'N',
                clientProductID => 'F',
                albumName       => 'G',
                isrc            => 'I',
                trackName       => 'J',
                units           => 'AE',
                price           => 'AH',
                mediaType       => 'M',
            },
         },
    };
}

sub _unverifiedFieldMapExtended {
    {
        digital => {
            option1 => {
                mediaCode      => 'O',
                _productArtist => 'H',
                _trackArtist   => 'K',
            },
        }
    };
}

sub _headerIdentifierExtended {
    {
        digital => {
            option1 => {
                isrc => 'ISRC',
            },
        },
    };
}

sub currencyCode { 'USD' }

sub serviceID {
    my $self = shift;

    my $service = lc( $self->_getByFieldName('serviceID') || '' );
    $service =~ s/^([^(]*).*$/$1/;
    $service =~ s/^\s+|\s+$//g;

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

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

sub countryCode {
    my $self = shift;

    my $name = $self->_getByFieldName('countryCode') || '';
    $name = ( split '-', $name )[-1];
    $name =~ s/^\s+|\s+$//g;

    my $oCountry = Common::Country->Get($name);
    return $oCountry->alpha2() if $oCountry ;

    $self->handleError("Unknown country: $name", RPS::DB::Item::SaleImportError::kErrorCountry );
    return $name;
}

sub saleDates {
    my $self = shift;

    my $startDate = $self->_getByFieldName('dateBegin') || '';

    my ($dateBegin, $dateEnd);
    if ( $startDate =~ /(\d{4}) H(\d)/i ) {
        my ($year, $half) = ($1, $2);
        if ( $half eq '1' ) {
            $dateBegin = sprintf( "%04d-%02d-%02d", $year, 1, 1 );
            $dateEnd   = sprintf( "%04d-%02d-%02d", $year, 6, 30 );
        } elsif ( $half eq '2' ) {
            $dateBegin = sprintf( "%04d-%02d-%02d", $year, 7,  1 );
            $dateEnd   = sprintf( "%04d-%02d-%02d", $year, 12, 31 );
        }
    }

    return $dateBegin, $dateEnd;
}

sub productType {
    my $self = shift;

    my $isrc      = $self->_getByFieldName('isrc')      || '';
    my $trackName = $self->_getByFieldName('trackName') || '';

    return $isrc && $trackName
        ? RPS::File::Sale::TYPE_TRACK
        : RPS::File::Sale::TYPE_ALBUM;
}

sub formatType {
    my $self = shift;

    my $channel = $self->_getByFieldName('mediaCode') || '';
    my $config  = $self->_getByFieldName('mediaType') || '';
    ( my $channelPrefix = $channel ) =~ s/^([a-zA-Z0-9]+).*$/$1/;
    ( my $configPrefix  = $config  ) =~ s/^([a-zA-Z0-9]+).*$/$1/;

    my $type = "$channelPrefix:$configPrefix";
    if ( $type =~ /^D(AS|BA|BL|BP|BS|BT|FS|LS|PS|SA|SC|SP):.*$/i ) {
        return RPS::File::Sale::FORMAT_STREAM;
    } elsif ( $type =~ /^D(BC|CD|LK):.*$/i ) {
        return RPS::File::Sale::FORMAT_TETHERED;
    } elsif ( $type =~ /^D(OL|PR|SD):.*$/i ) {
        return RPS::File::Sale::FORMAT_DOWNLOAD;
    } elsif ( $type =~ /^DCR:R[3|5]$/i ) {
        return RPS::File::Sale::FORMAT_RINGTONE;
    } elsif ( $type =~ /^(DEP|DSE):.*$/i ) {
        return RPS::File::Sale::FORMAT_PERFORMANCE;
    } elsif ( $type =~ /^DCR:B1$/i ) {
        return $self->handleError("Format type is missing: $type", RPS::DB::Item::SaleImportError::kErrorNonqualifying);
    }

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

sub artistName {
    my $self = shift;

    my $productArtist = $self->_getByFieldName('_productArtist') || '';
    my $trackArtist   = $self->_getByFieldName('_trackArtist')   || '';

    return $self->productType eq RPS::File::Sale::TYPE_ALBUM
        ? $productArtist
        : $trackArtist;
}

sub mediaType {
    my $self = shift;

    my $type = $self->_getByFieldName('mediaType') || '';
    return $type =~ /video/i
        ? RPS::DB::Item::MediaType::kMediaTypeVideo
        : RPS::DB::Item::MediaType::kMediaTypeAudio;
}

# mapFace
sub _mapFaceServiceID {
    my $self = shift;
    my $service = $self->_getByFieldName('serviceID') || '';
    $service =~ s/^([^(]*).*$/$1/;
    $service =~ s/^\s+|\s+$//g;
    return { 'serviceID' => qr/^$service/i };
}

sub _mapFaceCountryCode { 'countryCode' }
sub _mapFaceProductType { }
sub _mapFaceFormatType  { 'mediaCode', 'mediaType' }
sub _mapFaceMediaType   { }


1;
