package RPS::Import::Sony::v9;

use strict;

use Date::Calc qw(Days_in_Month);

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

use lib '/app/tools/rps/lib';
use base 'RPS::Import::Importer';

use Data::Dumper;

my %gProductFormatMap = (
    'audio album' => {
        '(online|mobile) permanent dow' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format       => RPS::File::Sale::FORMAT_DOWNLOAD,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'kiosk' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format       => RPS::File::Sale::FORMAT_DOWNLOAD,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'multi-platform perma' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format       => RPS::File::Sale::FORMAT_DOWNLOAD,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'audio ep' => {
        'online permanent dow' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format       => RPS::File::Sale::FORMAT_DOWNLOAD,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'audio track' => {
        '(online|mobile) stream \(non-a' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_STREAM,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'mobile stream \(ad su' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_STREAM,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'mobile tethered \(non' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_TETHERED,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        '(online|mobile) permanent dow' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_DOWNLOAD,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'jukebox' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_JUKEBOX,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'online stream \(ad su' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_STREAM,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'online tethered \(non' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_TETHERED,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'locker' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_STREAM,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'multi-platform tethe' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_TETHERED,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'multi-platform strea' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_STREAM,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        '(kiosk|multi-platform perma)' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_DOWNLOAD,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'user defined \(mobile' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_RINGTONE,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'locker - streaming' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_STREAM,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'background music \(bgm\)' => {
        'jukebox' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_JUKEBOX,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'custom ringtone' => {
        '(online|mobile) permanent dow' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_RINGTONE,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'digital bundle' => {
        'online permanent dow' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format       => RPS::File::Sale::FORMAT_DOWNLOAD,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'digital dvd longplay' => {
        'online permanent dow' => {
            product_type => RPS::File::Sale::TYPE_ALBUM,
            format       => RPS::File::Sale::FORMAT_DOWNLOAD,
            media        => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    'digital video ep' => {
        'online permanent dow' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_DOWNLOAD,
            media        => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    'mastertone' => {
        'mobile tethered \(non' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_TETHERED,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        '(online|mobile) permanent dow' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_RINGTONE,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'premium ugc' => {
        'online stream \(ad su' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_STREAM,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'ringback tone' => {
        'mobile permanent dow' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_RINGTONE,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'mobile tethered \(non' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_TETHERED,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'user gen video \(audio source\)' => {
        'online stream \(ad su' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_STREAM,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
    'user gen video \(video source\)' => {
        'online stream \(ad su' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_STREAM,
            media        => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    'video track' => {
        'online stream \(ad su' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_STREAM,
            media        => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'locker' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_STREAM,
            media        => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'online permanent dow' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_DOWNLOAD,
            media        => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'jukebox' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_JUKEBOX,
            media        => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'online stream \(non-a' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_STREAM,
            media        => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
        'online sbme web netw' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_STREAM,
            media        => RPS::DB::Item::MediaType::kMediaTypeVideo,
        },
    },
    '9' => {
        'mobile permanent dow' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_RINGTONE,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
        'online permanent dow' => {
            product_type => RPS::File::Sale::TYPE_TRACK,
            format       => RPS::File::Sale::FORMAT_DOWNLOAD,
            media        => RPS::DB::Item::MediaType::kMediaTypeAudio,
        },
    },
);

sub _headerIdentifier { (dateBegin => 'Reporting Period Fro') }

sub _fieldMap {
    {
        labelName        => 'P',
        dateBegin        => 'F',
        dateEnd          => 'G',
        productType      => 'L', # Product Type
        artistName       => 'B',
        albumName        => 'C',
        upc              => 'E',
        trackName        => 'C',
        isrc             => 'H',
        formatType       => 'M', # Download Type
        units            => 'R',       
        price            => 'Q',
    }
}

sub countryCode { 'US' }

sub currencyCode { 'USD' }

sub _isValidSaleRecord {
    my $self = shift;

    my $productType = lc($self->_getByFieldName('productType')) || return;
    my $formatType  = lc($self->_getByFieldName('formatType')) || return;

    # Skip any sub-headers
    #
    if( $productType && $productType =~ /product type/i &&
        $formatType && $formatType =~ /download type/i )
    {
        return;
    }

    return $self->SUPER::_isValidSaleRecord();
}

sub _getDateBegin {
        
    my $self = shift;
    my $dateBegin = lc($self->_getByFieldName('dateBegin')) || return;  
    my $_dateBegin;

    my $month;
    my $year;
    if( $dateBegin =~ /^(\d{1,2})(\d\d)$/ ) # MYY or MMYY
    {
        $year = "20" . $2;
        $month = $1;
        $_dateBegin = sprintf( "%04d-%02d-%02d", $year, $month, 1 );
    }

    return $_dateBegin;    
}

sub _getDateEnd {
        
    my $self = shift;
    my $dateEnd = lc($self->_getByFieldName('dateEnd')) || return;   
    my $_dateEnd;
    
    my $month;
    my $year;
    if( $dateEnd =~ /^(\d{1,2})(\d\d)$/ ) # MYY or MMYY
    {
        $year = "20" . $2;
        $month = $1;
        $_dateEnd = sprintf( "%04d-%02d-%02d", $year, $month, Days_in_Month($year,$month ) );
    }
    return $_dateEnd;    
}

sub _getMappings {
    my $self = shift;
    my $productType = lc($self->_getByFieldName('productType')) || return;
    my $formatType  = lc($self->_getByFieldName('formatType')) || return;

    my $_productType;
    my $_formatType;
    my $_mediaType;

    foreach my $_pType (keys %gProductFormatMap)
    {
        if( $productType =~ /^$_pType$/i )
        {
            foreach my $_fType (keys %{$gProductFormatMap{$_pType}})
            {
                if( $formatType =~ /^$_fType$/i )
                {
                    $_productType = $gProductFormatMap{$_pType}{$_fType}{product_type};
                    $_formatType  = $gProductFormatMap{$_pType}{$_fType}{format};
                    $_mediaType   = $gProductFormatMap{$_pType}{$_fType}{media};
#                    print STDERR "D: $_pType  /  $_fType ---> P($_productType) F($_formatType) M($_mediaType)\n";
                    last;
                }
            }
        }
    }
    return( $_productType, $_formatType, $_mediaType );
}

sub productType {
    my $self = shift;
    my $productType = lc($self->_getByFieldName('productType')) || return;
    my $formatType  = lc($self->_getByFieldName('formatType')) || return;

    my( $_productType, $_formatType, $_mediaType ) = $self->_getMappings();

    $self->fail( "Could not determine product type from $productType / $formatType" ) if( !$_productType );

    return $_productType;
}

sub formatType {
    my $self = shift;

    my $productType = lc($self->_getByFieldName('productType')) || return;
    my $formatType  = lc($self->_getByFieldName('formatType')) || return;

    my( $_productType, $_formatType, $_mediaType ) = $self->_getMappings();

    $self->fail( "Could not determine format type from $productType / $formatType" ) if( !$_formatType );

    return $_formatType;
}

sub mediaType    { 
    my $self = shift;

    my $productType = lc($self->_getByFieldName('productType')) || return;
    my $formatType  = lc($self->_getByFieldName('formatType')) || return;

    my( $_productType, $_formatType, $_mediaType ) = $self->_getMappings();

    $self->fail( "Could not determine media type from $productType / $formatType" ) if( !$_mediaType );

    return $_mediaType;
}

sub trackName {
    my $self = shift;
    return $self->productType eq RPS::File::Sale::TYPE_ALBUM ? undef : $self->SUPER::trackName;
}

sub albumName {
    my $self = shift;
    return $self->productType eq RPS::File::Sale::TYPE_TRACK ? undef : $self->SUPER::albumName;
}

sub isrc {
    my $self = shift;
    my $isrc = $self->_getByFieldName('isrc') || return;
    return ($isrc =~ /not assigned/i ) ? undef : $isrc;
}

sub upc {
    my $self = shift;
    my $upc = $self->_getByFieldName('upc') || return;
    return ($upc =~ /not assigned/i ) ? undef : $upc;
}

sub _isValidSaleRecord {
    my $self = shift;

    return if ( $self->units < 0 && $self->price == 0 );

    return ( defined($self->units) && $self->units != 0 && ($self->trackName || $self->albumName) );
}

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