package RPS::Import::Cadence;

use strict;

use Date::Calc qw(Days_in_Month Add_Delta_Days Decode_Month);

use lib '/app/tools/common/lib';
use Common::Country;

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

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

my %product_format_map = (
    'DIGITAL ONLINE AUD ALBUM PERMANENT' => RPS::File::Sale::FORMAT_DOWNLOAD,
    'DIGITAL ONLINE AUD TRACK PERMANENT' => RPS::File::Sale::FORMAT_DOWNLOAD,
    'DIGITAL ONLINE VID TRACK PERMANENT' => RPS::File::Sale::FORMAT_DOWNLOAD,
    'DOWNLOAD (ALBUM)'                   => RPS::File::Sale::FORMAT_DOWNLOAD,
    'DOWNLOAD (TRACK)'                   => RPS::File::Sale::FORMAT_DOWNLOAD,
    'DOWNLOAD (VIDEO)'                   => RPS::File::Sale::FORMAT_DOWNLOAD,    
    'PRE-ORDER DOWNLOAD (ALBUM)'         => RPS::File::Sale::FORMAT_DOWNLOAD,
    'RETURN CMA DOWNLOAD (TRACK)'        => RPS::File::Sale::FORMAT_DOWNLOAD,
    'RETURN DOWNLOAD (TRACK)'            => RPS::File::Sale::FORMAT_DOWNLOAD,
    'RETURN DOWNLOAD (ALBUM)'            => RPS::File::Sale::FORMAT_DOWNLOAD,     
    'SUBSCR'                             => RPS::File::Sale::FORMAT_STREAM,
    'AUDIO TRACK STREAM WEBCAST'         => RPS::File::Sale::FORMAT_STREAM,
    'SU'                                 => RPS::File::Sale::FORMAT_STREAM,
    'CMA DOWNLOAD (ALBUM)'               => RPS::File::Sale::FORMAT_STREAM,
    'DIGITAL ONLINE AUD TRACK STREAM'    => RPS::File::Sale::FORMAT_STREAM,
    'SUBSCR'                             => RPS::File::Sale::FORMAT_STREAM,  
    'DIGITAL ONLINE VID TRACK STREAM'    => RPS::File::Sale::FORMAT_STREAM,  
    'STREAMING (AD-SUPPORTED)'           => RPS::File::Sale::FORMAT_STREAM,
    'STREAMING (CLOUD)'                  => RPS::File::Sale::FORMAT_STREAM,
    'STREAMING (FREE TRIAL)'             => RPS::File::Sale::FORMAT_STREAM,
    'STREAMING (LOCKER)'                 => RPS::File::Sale::FORMAT_STREAM,
    'STREAMING (RADIO)'                  => RPS::File::Sale::FORMAT_STREAM,
    'STREAMING (SUBSCRIPTION)'           => RPS::File::Sale::FORMAT_STREAM,  
    'STREAMING (VIDEO)'                  => RPS::File::Sale::FORMAT_STREAM, 
    'SU'                                 => RPS::File::Sale::FORMAT_STREAM,
    'SUBSCR'                             => RPS::File::Sale::FORMAT_STREAM,
    'USER GENERATED CONTENT STREAM'      => RPS::File::Sale::FORMAT_STREAM,
    'VIDEO STREAM VIDEO PORTABLE'        => RPS::File::Sale::FORMAT_STREAM,
    'VIDEO STREAMING (CLOUD)'            => RPS::File::Sale::FORMAT_STREAM,
    'VIDEO STREAMING (FREE TRIAL)'       => RPS::File::Sale::FORMAT_STREAM,  
    'VIDEO STREAMING (SUBSCRIPTION)'     => RPS::File::Sale::FORMAT_STREAM,           
    'DOWNLOAD (RENTAL)'                  => RPS::File::Sale::FORMAT_TETHERED,  
);

# This is currently only being used to map the service ID back to Cadence.
my %service_map = (
    'AUDIO CLOUD SERVICES'                => 1234,
    'AUDIO CLOUD SERVICES'                => 1234,
    'AUDIO TRACK STREAM PORTABLE'         => 1234,
    'AUDIO TRACK STREAM WEBCAST'          => 1234,
    'AUDIO TRACK STREAM WEBCAST PORTABLE' => 1234,
    'DIGITAL ONLINE AUD ALBUM PERMANENT'  => 1234,
    'DIGITAL ONLINE AUD TRACK PERMANENT'  => 1234,
    'DIGITAL ONLINE AUD TRACK STREAM'     => 1234,
    'DIGITAL ONLINE VID TRACK STREAM'     => 1234,
    'DIGITAL ONLINE VID TRACK PERMANENT'  => 1234,
    'USER GENERATED CONTENT STREAM'       => 1234,
    'VIDEO STREAM VIDEO PORTABLE'         => 1234,
    'VIDEO CLOUD SERVICES'                => 1234,
);

sub _fieldMap {
    {
        serviceID    => 'H',        
        dateBegin    => 'A',
        countryCode  => 'B',
        productType  => 'D',
        formatType   => 'H',
        artistName   => 'J',
        serviceProductID => 'I',
        upc          => 'F',
        albumName    => 'K',
        isrc         => 'G',
        trackName    => 'D',
        units        => 'B',
        free         => 'H',
        price        => 'C',
        mediaType    => 'D',
    }
}

sub _headerIdentifier { ( isrc => 'isrc' ) }

sub countryCode  { 'CA' }
sub currencyCode { 'CAD' }

sub saleDates {
    my $self = shift;
    my $dt = $self->_getByFieldName('dateBegin');

    my $dateBegin;
    my $dateEnd;

    if( $dt =~ /^(\d{4})(\d{2})$/ ) # YYYYMM
    {
        my $year = $1;
        my $month = $2;
        $dateBegin = sprintf("%04d-%02d-%02d", $year, $month, 1);
        $dateEnd   = sprintf("%04d-%02d-%02d", $year, $month, Days_in_Month($year, $month));
    }
    else
    {
        ($dateBegin, $dateEnd ) = $self->_getDates( date_begin => $dt );
    }
    return ($dateBegin, $dateEnd);
}

sub serviceID {
    my $self = shift;
    my $serviceName = $self->_getByFieldName('serviceID');
    
    # If there's a hyphen, we just want everything before it.
    $serviceName =~ s/(.*) - .*/$1/;
    
    my $serviceID;
    
    # First we'll see if we should just use the Cadence service ID.
    my $serviceID = $service_map{ uc $serviceName };
    
    if (!$serviceID) {
        $serviceID = $self->getServiceID(lc ($serviceName)) || $RPS::Import::ServiceMap::SERVICE_ALIASES{ lc $serviceName };
    }
    
    if( !$serviceID )
    {
        $self->fail("Unknown service: $serviceName");
    }

    return $serviceID;
}

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

    if( lc($type) eq 'a')
    {
        return RPS::File::Sale::TYPE_ALBUM;
    }
    elsif( lc($type) eq 't' ||  lc($type) eq 'v' )
    {
        return RPS::File::Sale::TYPE_TRACK;
    }
    $self->fail("Unknown product type: $type");
}

sub formatType {
    my $self = shift;
    my $type = $self->_getByFieldName('formatType');
    
    # Quick check for SoundExchange first.
    if ($type =~ /^SoundExchange - Streaming \(Radio\)$/i) {
        return RPS::File::Sale::FORMAT_PERFORMANCE;
    }
    
    # If there's a hyphen, we just want everything after it.
    $type =~ s/.* - (.*)/$1/;
    
    my $format = $product_format_map{ uc $type };

    if( !$format )
    {
        $self->fail("Unknown format: $type");
    }
    return $format;
}

sub mediaType {
    my $self = shift;
    my $type = substr($self->_getByFieldName('productType'), 0, 1);

    if( lc($type) eq 'a' || lc($type) eq 't' )
    {
        return RPS::DB::Item::MediaType::kMediaTypeAudio;
    }
    elsif( lc($type) eq 'v' )
    {
        return RPS::DB::Item::MediaType::kMediaTypeVideo;
    }
    $self->fail("Unknown media type: $type");    
}

sub trackName {
    my $self = shift;
    my $name = $self->_getByFieldName('trackName');

    my $trackCheck = substr($name, 0, 1);
    
    if (lc($trackCheck) eq 't' ||  lc($trackCheck) eq 'v') {
        # If there's a hyphen, we just want everything after it.
        $name =~ s/.* - (.*)/$1/;
        
        return $name;
    }
    else
    {
        return;
    }
}

sub free {
    my $self = shift;
    my $free = $self->_getByFieldName('free');
    my $price = $self->_getByFieldName('price');
    if ($price == 0 && $free =~ /free trial/i) {
        return 1;
    }
    return 0;
}

sub units {
    my $self = shift;
    my $units = $self->_getByFieldName('units');
    my $price = $self->_getByFieldName('price');
    if ($price < 0 && $units > 0) {
        $units *= -1;
    }
    return $units;
}


###
1;# Play nicely.
###
