package RPS::Import::Seed::v1;

use strict;
use warnings;

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

use base 'RPS::Import::Importer';

sub _fieldMap {
    {
        labelName        => 'A',
        serviceID        => 'L',
        countryCode      => 'O',
        productType      => 'E',
        formatType       => 'P',
        artistName       => 'C',
        clientProductID  => 'B',
        serviceProductID => 'J',
        upc              => 'G',
        albumName        => 'D',
        isrc             => 'H',
        trackName        => 'D',
        units            => 'U',
        price            => 'AC',
        dateBegin        => 'M',
        mediaType        => 'Q'
    };
}

sub _headerIdentifier { upc => 'UPC' }

sub currencyCode { 'USD' }

sub saleDates {
    my $self  = shift;

    my ($d, $m, $y);
    my $date = $self->_getByFieldName('dateBegin') || '';
    if ( ($m, $d, $y) = $date =~ /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/ ) {
        ($m, $d) = ($d, $m) if $m > 12;
        return
            sprintf("%04d-%02d-%02d", $y, $m, 1),
            sprintf("%04d-%02d-%02d", $y, $m, Days_in_Month($y, $m));
    } elsif ( ($m, $y) = $self->filename =~ /(\d{2})(\d{4})/ ) {
        return
            sprintf("%04d-%02d-%02d", $y, $m, 1),
            sprintf("%04d-%02d-%02d", $y, $m, Days_in_Month($y, $m));
    }

    $self->fail( "Could not determine date from '$date'." );
}

sub mediaType {
    my $self = shift;

    my $type = $self->_getByFieldName('mediaType') || '';

    # RSD-4922
    if ( $type =~ /(?:video|vevo)/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeVideo;
    }

    $type = $self->_getByFieldName('productType') || '';
    if ( $type =~ /^(?:Album|Compilation|EP|Mini Album|Ringtone|Single|Track)$/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;
    } elsif ( $type =~ /^(?:Video Single|Video)$/i ) {
        return RPS::DB::Item::MediaType::kMediaTypeVideo;
    }

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

sub serviceID {
    my $self      = shift;
    my $service   = $self->_getByFieldName('serviceID');
    my $serviceID = $self->getServiceID( lc($service) ) || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $service };
    return $serviceID if ($serviceID);
    $self->fail("Unknown service '$service'");
}

sub productType {
    my $self = shift;
    my $type = $self->_getByFieldName('productType');

    if (   $type =~ /^Ringtone$/i
        || $type =~ /^Track$/i
        # RSD-4922
        || $type =~ /^Video$/i ) {
        return RPS::File::Sale::TYPE_TRACK;
    } elsif ( $type =~ /^Album$/i
        || $type =~ /^Compilation$/i
        || $type =~ /^EP$/i
        || $type =~ /^Mini Album$/i
        || $type =~ /^Single$/i
        || $type =~ /^Video Single$/i ) {
        return RPS::File::Sale::TYPE_ALBUM;
    }

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

sub formatType {
    my $self = shift;

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

    # RSD-4498 - an additional rule
    if ( !$format && $serviceID =~ /^(?:Amazon Cloud|Music Aroma)$/i ) {
        return RPS::File::Sale::FORMAT_STREAM;
    } elsif ( !$format && $serviceID =~ /^(?:WASABEAT\.JP|WASABEAT.COM)$/i ) {
        return RPS::File::Sale::FORMAT_DOWNLOAD;
    }

    if ( $format =~ /^Ringtone$/i ) {
        return RPS::File::Sale::FORMAT_RINGTONE;
    }
    elsif ( $format =~ /^(?:Conditional)?Download$/i
        || $format =~ /^PermanentDownload$/i
        || $format =~ /^mp3 320kbps$/i
        || $format =~ /^wav$/i ) {
        return RPS::File::Sale::FORMAT_DOWNLOAD;
    }
    elsif ( $format =~ /^Cloud$/i
        || $format =~ /^Downloads$/i
        || $format =~ /^(?:OnDemand|NonInteractive)?Stream$/i
        || $format =~ /^Subscription$/i
        || $format =~ /^Korean Stream\/Download$/i
        || $format =~ /^streams$/i
        || $format =~ /^Subscription$/i ) {
        return RPS::File::Sale::FORMAT_STREAM;
    }
    elsif ( $format =~ /^ERROR - New Delivery Type$/i ) {
        return RPS::File::Sale::FORMAT_PERFORMANCE if ( $self->serviceID == Client::Service::DSP_PANDORA );    # Case 19907
    }

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

sub albumName {
    my $self = shift;

    my $albumName = $self->_getByFieldName('albumName') || return;
    return $self->productType eq RPS::File::Sale::TYPE_ALBUM ? $albumName : undef;
}

sub trackName {
    my $self = shift;
    my $trackName = $self->_getByFieldName('trackName') || return;
    return $self->productType eq RPS::File::Sale::TYPE_TRACK ? $trackName : undef;
}

sub isrc {
    my $self = shift;
    my $isrc = $self->_getByFieldName('isrc');
    if ($isrc) {
        return Common::Util::normalize_isrc($isrc);
    }
}

sub upc {
    my $self = shift;
    my $upc  = $self->_getByFieldName('upc');
    if ($upc) {
        return Common::Util::normalize_upc($upc);
    }
}

sub price {
    my $self   = shift;
    my $_price = $self->_getByFieldName('price') || 0;

    # deal with numbers from text files
    $_price = ( $1 * -1 ) if ( $_price =~ /\((\d+\.\d+)\)/ );
    $_price =~ s/ $//;

    return $_price;
}

sub units {
    my $self   = shift;
    my $_units = $self->_getByFieldName('units') || 0;
    my $_price = $self->_getByFieldName('price') || 0;

    # deal with numbers from text files
    $_units =~ s/,//;
    $_units =~ s/ $//;
    $_price =~ s/ $//;
    $_units = ( $1 * -1 ) if ( $_units =~ /\((\d+)\)/ );
    $_price = ( $1 * -1 ) if ( $_price =~ /\((\d+\.\d+)\)/ );

    # Making units follow the sign of the revenue.
    # See https://royaltyshare.fogbugz.com/default.asp?W21
    #
    if ( ( $_price < 0 && $_units > 0 ) || ( $_price > 0 && $_units < 0 ) ) {
        $_units *= -1;
    }

    return $_units;
}


1;
