package RPS::Import::Nugs::v3;

use strict;
use warnings;

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

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

sub physical { 2 }

sub _fieldMapExtended {
    {
        digital => {
            option1 => {
                dateBegin        => 'E',
                dateEnd          => 'E',
                productType      => 'F',
                formatType       => 'F',
                serviceProductID => 'A',
                artistName       => 'D',
                trackName        => 'C',
                units            => 'I',
                price            => 'J',
                mediaType        => 'F',
            },
         },
    };
}

sub _unverifiedFieldMapExtended {
    {
        digital => {
            option1 => {
                _albumNameSouce => 'K',
                _albumNameTitle => 'C',
            },
        }
    };
}

sub _headerIdentifierExtended {
    {
        digital => {
            option1 => {
                productType => 'Config',
            },
        },
    };
}

my %map = (
    "ALAC" => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    "FLAC" => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    "FLHD" => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    "ALHD" => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    "MP3"  => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    "MP3S" => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    "STRM" => {
        product_type => RPS::File::Sale::TYPE_TRACK,
        format_type  => RPS::File::Sale::FORMAT_STREAM,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
    "HLIV" => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        format_type  => RPS::File::Sale::FORMAT_STREAM,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    "HVOD" => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        format_type  => RPS::File::Sale::FORMAT_STREAM,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    "LIV" => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        format_type  => RPS::File::Sale::FORMAT_STREAM,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    "VOD" => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        format_type  => RPS::File::Sale::FORMAT_STREAM,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeVideo,
    },
    "MQA" => {
        product_type => RPS::File::Sale::TYPE_ALBUM,
        format_type  => RPS::File::Sale::FORMAT_DOWNLOAD,
        media_type   => RPS::DB::Item::MediaType::kMediaTypeAudio,
    },
);

sub countryCode  { 'US' }
sub currencyCode { 'USD' }

sub productType {
    my $self = shift;

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

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

sub formatType {
    my $self = shift;

    my $type = uc( $self->_getByFieldName('formatType') || '' );
    return $map{$type}{format_type} if exists $map{$type};

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

sub mediaType {
    my $self = shift;

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

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

sub albumName {
    my $self = shift;

    my $productType = $self->productType;
    if ( $productType eq RPS::File::Sale::TYPE_TRACK ) {
        return $self->_getByFieldName('_albumNameSouce');
    } elsif ( $productType eq RPS::File::Sale::TYPE_ALBUM ) {
        return $self->_getByFieldName('_albumNameTitle');
    }
}

sub trackName {
    my $self = shift;

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

    return;
}

sub units {
    my $self = shift;

    my $price = $self->_getByFieldName('price') || 0;
    my $units = $self->_getByFieldName('units') || 0;

    if ( $price > 0 ) {
         $units = $units ? abs($units) : 1;
    } elsif ( $price < 0 ) {
        $units = $units ? -1 * abs($units) : -1;
    }

    return $units;
}

sub _isValidSaleRecord {
    my $self = shift;

    return defined $self->units && defined $self->_getByFieldName('price')
        && ( $self->_getByFieldName('albumName') || $self->_getByFieldName('trackName') );
}


1;
