package RPS::Import::EMIMusic::iTunesWeekly::v1;

use strict;

use Date::Calc qw(Days_in_Month);

use lib '/app/tools/common/lib';
use Common::Util;
use Common::Consts;

use lib '/app/tools/data_classes/lib';
use Client::Client;

use lib '/app/tools/rps/lib';
use RPS::File::Sale;
use RPS::DB::Item::MediaType;

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


#Provider
#Provider Country
#Vendor Identifier
#UPC
#ISRC
#Artist   Show
#Title
#Label Studio Network
#Product Type Identifier
#Units
#Royalty Price
#Download Date (PST)
#Order Id
#Postal Code
#Customer Identifier
#Report Date (Local)
#Sale Return
#Customer Currency
#Country Code
#Royalty Currency
#PreOrder
#ISAN
#Customer Price
#Apple Identifier
#CMA
#Asset Content Flavor
#Vendor Offer Code
#Grid
#Promo Code
#Parent Identifier

sub _fieldMap {
    {
        clientProductID     => 'C',
        upc                 => 'D',
        isrc                => 'E',
        artistName          => 'F',
        labelName           => 'H',
        units               => 'J',
        price               => 'K',
        dateBegin           => 'P',
        countryCode         => 'S',
        currencyCode        => 'T',
        serviceProductID    => 'X',
	}
}

sub _unverifiedFieldMap {{
        title               => 'G',
        appleProductType    => 'I',
}}

sub _headerIdentifier { ( upc => 'UPC' ) }

sub _mapAppleProductType
{
    my ($self) = @_;
    
    my $iTunesType = lc($self->_getByFieldName('appleProductType'));
    my $isrc = $self->isrc();

    if ($iTunesType eq 'v')
    {
        $self->{_productType} = RPS::File::Sale::TYPE_TRACK;
        $self->{_formatType} = RPS::File::Sale::FORMAT_DOWNLOAD;
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeVideo;
    }
    elsif ($iTunesType eq 'j')
    {
        $self->{_productType} = ($isrc) ? RPS::File::Sale::TYPE_TRACK : RPS::File::Sale::TYPE_ALBUM;
        $self->{_formatType} = RPS::File::Sale::FORMAT_DOWNLOADPREMIUM;
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeVideo;
    }
    elsif ($iTunesType eq 'x')
    {
        $self->{_productType} = RPS::File::Sale::TYPE_TRACK;
        $self->{_formatType} = RPS::File::Sale::FORMAT_DOWNLOADUPGRADE;
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeVideo;
    }
    elsif ($iTunesType eq 'p')
    {
        $self->{_productType} = RPS::File::Sale::TYPE_ALBUM;
        $self->{_formatType} = RPS::File::Sale::FORMAT_DOWNLOAD;
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeAudio;
    }
    elsif ($iTunesType eq 's')
    {
        $self->{_productType} = RPS::File::Sale::TYPE_TRACK;
        $self->{_formatType} = RPS::File::Sale::FORMAT_DOWNLOAD;
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeAudio;
    }
    elsif ($iTunesType eq 'h')
    {
        $self->{_productType} = RPS::File::Sale::TYPE_TRACK;
        $self->{_formatType} = RPS::File::Sale::FORMAT_DOWNLOADPREMIUM;
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeAudio;
    }
    elsif ($iTunesType eq 'i')
    {
        $self->{_productType} = RPS::File::Sale::TYPE_ALBUM;
        $self->{_formatType} = RPS::File::Sale::FORMAT_DOWNLOADPREMIUM;
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeAudio;
    }
    elsif ($iTunesType eq 'u')
    {
        $self->{_productType} = RPS::File::Sale::TYPE_TRACK;
        $self->{_formatType} = RPS::File::Sale::FORMAT_DOWNLOADUPGRADE;
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeAudio;
    }
    elsif ($iTunesType eq 'w')
    {
        $self->{_productType} = RPS::File::Sale::TYPE_ALBUM;
        $self->{_formatType} = RPS::File::Sale::FORMAT_DOWNLOADUPGRADE;
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeAudio;
    }
    elsif ($iTunesType eq 'r')
    {
        $self->{_productType} = RPS::File::Sale::TYPE_TRACK;
        $self->{_formatType} = RPS::File::Sale::FORMAT_RINGTONE;
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeAudio;
    }
    elsif ( $iTunesType eq 'e' )
    {
        $self->{_productType} = RPS::File::Sale::TYPE_ALBUM;
        $self->{_formatType} = RPS::File::Sale::FORMAT_DOWNLOAD; # Case 13085
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeVideo;
    }
    elsif ( $iTunesType eq 'f' )
    {
        $self->{_productType} = RPS::File::Sale::TYPE_ALBUM;
        $self->{_formatType} = RPS::File::Sale::FORMAT_TETHERED; # Case 13085
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeVideo;
    }
    elsif ($iTunesType eq 'pr')
    {
        $self->{_productType} = RPS::File::Sale::TYPE_TRACK;
        $self->{_formatType} = RPS::File::Sale::FORMAT_RINGTONE;
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeAudio;
    }
    elsif ($iTunesType eq 'm')
    {
        $self->{_productType} = RPS::File::Sale::TYPE_ALBUM;
        $self->{_formatType} = RPS::File::Sale::FORMAT_DOWNLOAD;
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeVideo;
    }
    elsif ($iTunesType eq 'd')
    {
        $self->{_productType} = RPS::File::Sale::TYPE_ALBUM;
        $self->{_formatType} = RPS::File::Sale::FORMAT_TETHERED;
        $self->{_mediaType} = RPS::DB::Item::MediaType::kMediaTypeVideo;
    }
    # !!! Wait, is 'blank' supposed to be valid?
#    elsif('' ne $iTunesType )
    else
    {
        $self->fail("Unknown iTunes type '$iTunesType'");
        return undef;
    }
                
    return 1;
}


# This method gets called for every line.
# So it's a good place to derive whether this is a track or an album, and
# set the various fields accordingly.
#
sub _isValidSaleRecord 
{
	my $self = shift;

    # Reset the private fields.
    #
    $self->{_productType} = undef;
    $self->{_formatType} = undef;
    $self->{_mediaType} = undef;
    $self->{_albumTitle} = undef;
    $self->{_trackTitle} = undef;

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

    # !!! I guess we don't want to treat title as a must-have column?   
    # !!! I find that weird.
    #
#    return undef unless ($self->units && $title && $self->countryCode && $self->currencyCode);
    return undef unless ($self->units && $self->countryCode && $self->currencyCode);

    
    # Try to map Apple's product type code to our three codes.
    #
    return undef unless $self->_mapAppleProductType();

    
    # Now set the correct title.
    #
    if (RPS::File::Sale::TYPE_TRACK eq $self->{_productType})
    {
        $self->{_trackTitle} = $title;
    }
    elsif (RPS::File::Sale::TYPE_ALBUM eq $self->{_productType})
    {
        $self->{_albumTitle} = $title;
    }
    else
    {
        # !!! This shouldn't happen...
        #
        $self->fail("Unable to determine whether this is a track or an album");
    }


    return 1;
}


sub formatType
{
	my $self = shift;
    return $self->{_formatType};
}

sub productType 
{
	my $self = shift;
    return $self->{_productType};
}
	    
sub mediaType 
{
	my $self = shift;
    return $self->{_mediaType};
}

sub trackName
{
    my $self = shift;
    return $self->{_trackTitle};
}

sub albumName
{
    my $self = shift;
    return $self->{_albumTitle};
}



# Overriding this to check the client id.
# We want to limit this to EMI exclusively.
# The advantage of doing that here is that we can just
# throw an exception, and it will gracefully be transformed into an error
# message attached to the file that the user can see on the Tracker page.
#
sub _importLines
{
    my $self = shift;
    my %args = @_;

    die "File Format not available" unless Client::Client::kEMI == Common::RSApp::GetClientID();

    return $self->SUPER::_importLines(%args);
}



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