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.
###
