package RPS::Import::Phonofile::v1;

use strict;

use lib '/app/tools/rps/lib';
use RPS::Import::ServiceMap;
use Common::Date;
use Date::Calc qw(Days_in_Month);

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

sub physical { 2 }

sub _fieldMapExtended {
    {
        digital => {
            option1 => {
                labelName       => 'O',
                serviceID       => 'B',
                countryCode     => 'D',
                dateBegin       => 'E',
                productType     => 'F',
                formatType      => 'G',
                clientProductID => 'J',
                artistName      => 'L',
                upc             => 'I',
                albumName       => 'K',
                isrc            => 'M',
                trackName       => 'N',
                units           => 'H',
                free            => 'C',
                price           => 'R',
                mediaType       => 'F'
            },
         },
    };
}

sub _unverifiedFieldMapExtended {
    {
        digital => {
            option1=> {
                distFee => 'Q'
            }
        }
    };
}

sub _headerIdentifierExtended {
    {
        digital => {
            option1 => {
                upc => 'UPC',
            },
        },
    };
}


sub currencyCode {
    my $self = shift;

    if ( my ($currencyCode) = $self->filename =~ /_(DKK|SEK|NOK|EUR|GBP|USD)/ ) {
        return $currencyCode;
    }

    $self->fail("Could not determine currency code from file name.");
}
sub free {
    my $self = shift;

    my $free = $self->_getByFieldName('free');
    my $price = $self->_getByFieldName('price');

    return 1 if ($free =~ /gratis/i && $price == 0);
    return 0;
}
sub productType  {
    my $self = shift;

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

    return RPS::File::Sale::TYPE_TRACK if $productType =~ /Track|Video/i;
    return RPS::File::Sale::TYPE_ALBUM if $productType =~ /Album/i;

    $self->fail("Could not parse product type from '$productType'");
}

sub formatType   {
    my $self = shift;

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

    return RPS::File::Sale::FORMAT_PERFORMANCE if $formatType =~ /InterNetRadio/i;
    return RPS::File::Sale::FORMAT_DOWNLOAD if $formatType =~ /Download/i;
    return RPS::File::Sale::FORMAT_STREAM if $formatType =~ /Streaming|CloudMatch|EmbeddedStream|Subscription/i;
    return RPS::File::Sale::FORMAT_RINGTONE if $formatType =~ /Ringtones/i;

    $self->fail("Could not parse format type from '$formatType'");
}
sub mediaType    {
    my $self = shift;

    my $mediaType = $self->_getByFieldName('mediaType');
    return RPS::DB::Item::MediaType::kMediaTypeAudio if $mediaType =~ /Album|Track/i;
    return RPS::DB::Item::MediaType::kMediaTypeVideo if $mediaType =~ /Video/i;
}

sub saleDates {
    my $self  = shift;

    my $sdate = $self->_getByFieldName('dateBegin') || "";
    my $startDate = $sdate =~ /^\d+$/
        ? Spreadsheet::ParseExcel::Utility::ExcelFmt( "yyyy-mm-dd", $sdate )
        : $sdate;
    $self->fail("Wrong start date: $sdate") if $startDate !~ /^(\d{4})-(\d{2})-(\d{2})$/;
    my $endDate = sprintf ("%04d-%02d-%02d", $1, $2, Days_in_Month($1, $2));

    return ( $startDate, $endDate );
}

sub serviceID {
    my $self = shift;

    my $service = lc( $self->_getByFieldName('serviceID') || '' );

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

    $self->fail("Unable to determine service id from '$service'") unless $serviceID;

	return $serviceID;
}

sub units {
    my $self = shift;

    my $units = $self->_getByFieldName('units') || 0;
    my $price = $self->_getByFieldName('price') || 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 $self->units || $self->price || $self->trackName;
}


1;
