package RPS::Import::Fontana2008;

use strict;

use Date::Calc qw(Days_in_Month Decode_Month);

use lib '/app/tools/common/lib';
use Common::Util;
use Common::Consts qw(%COUNTRY_CODE);

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

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

my %service_map = (
    'Calabash Music'                   => Client::Service::DSP_CALABASH,
    'Dancetracks Digital'              => Client::Service::DSP_DANCETRACKS,
    'DestraMusic.com'                  => Client::Service::DSP_DESTRAMUSIC,
    'iTunes Music Store'               => Client::Service::DSP_ITUNES,
    'Mix and Burn'                     => Client::Service::DSP_MIXANDBURN,
    'm-Qube'                           => Client::Service::DSP_MQUBE,
    'MSN Music Service'                => Client::Service::DSP_MSNMUSIC,
    'RealNetworks / Rhapsody'          => Client::Service::DSP_REAL,
    'T-Online'                         => Client::Service::DSP_TONLINE,
    'Virtual Music Stores'             => Client::Service::DSP_VIRTUALMUSICSTORE,
    'Virginmega.fr'                    => Client::Service::DSP_VIRGINMEGA,
    'Snocap/Myspace'                   => Client::Service::DSP_SNOCAP,
    'Napster - Streams'                => Client::Service::DSP_NAPSTER,
    'Rhapsody'                         => Client::Service::DSP_REAL,
    'FNAC'                             => Client::Service::DSP_FNAC,
    'Starbucks'                        => Client::Service::DSP_STARBUCKS,
    'My Store'                         => Client::Service::DSP_MYSTORE,
    'Audio Lunchbox - Streams'         => Client::Service::DSP_AUDIOLUNCHBOX,
    'eMusic'                           => Client::Service::DSP_EMUSIC,
    'Sony Connect'                     => Client::Service::DSP_SONY,
    'Fun Mobility'                     => Client::Service::DSP_FUNMOBILITY,
    'Zingy Mobile'                     => Client::Service::DSP_ZINGY,
    'Beatport.com'                     => Client::Service::DSP_BEATPORT,
    'Other Music'                      => Client::Service::DSP_OTHERMUSIC,
    'Verizon'                          => Client::Service::DSP_VERIZON,
    'MediaNet Digital'                 => Client::Service::DSP_MEDIANET,
    'OD2 (Loudeye)'                    => Client::Service::DSP_OD2,
    'SecuryCast Download'              => Client::Service::DSP_SECURYCAST,
    'Thumbplay - **updated'            => Client::Service::DSP_THUMBPLAY,
    'Bell Mobility Full Track'         => Client::Service::DSP_BELLMOBILITY,
    'Hudson Entertainment (US)'        => Client::Service::DSP_HUDSON,
    'Pure Tracks'                      => Client::Service::DSP_PURETRACKS,
    'Jamba/Jamster'                    => Client::Service::DSP_JAMSTER,
    'Navio / gBox'                     => Client::Service::DSP_NAVIO,
    'Bell Mobility Ringtone'           => Client::Service::DSP_BELLMOBILITY,
    'Mbop Digital'                     => Client::Service::DSP_MBOPDIGITAL,
    'Slacker'                          => Client::Service::DSP_SLACKERINC,
    'Livewire Mobile / Groove Mobile'  => Client::Service::DSP_GROOVEMOBILE,
    'Amazon MP3'                       => Client::Service::DSP_AMAZON,
    'Rogers Wireless Ringtone'         => Client::Service::DSP_ROGERSWIRELESS,
    'm-Qube / VeriSign'                => Client::Service::DSP_MQUBE,
    'BOOST MOBILE/NEXTEL'              => Client::Service::DSP_BOOST,
    'LISTEN/RHAPSODY'                  => Client::Service::DSP_LISTEN,
    'MEDIAPORT ENTERTAINMENT INC.'     => Client::Service::DSP_MEDIAPORT,
    'MOD SYSTEMS, INC.'                => Client::Service::DSP_MODSYSTEMS,
    'MUSICGREMLIN, INC.'               => Client::Service::DSP_MUSICGREMLIN,
    'NextRadio Solutions'              => Client::Service::DSP_NEXTRADIO,
    'T-MOBILE USA'                     => Client::Service::DSP_TMOBILE,
    'VIRGIN MOBILE USA'                => Client::Service::DSP_VIRGINMOBILE,
    'APPLE DIGITAL SALES'              => Client::Service::DSP_ITUNES,
    'LAST.FM'                          => Client::Service::DSP_LASTFM,
    'MOHEN, INC.'                      => Client::Service::DSP_SPIRALFROG,
    'DIGITAL KIOSK TECHNOLOGIES LLC'   => Client::Service::DSP_DIGITALKIOSKTECH,
    'YOU TUBE'                         => Client::Service::DSP_YOUTUBE,
    'VIRTUAL MUSIC STORES, INC.'       => Client::Service::DSP_VIRTUALMUSICSTORE,
    'TEENHOLLYWOOD.COM INC.'           => Client::Service::DSP_TEENHOLLYWOOD,
    'PURETRACKS/B3'                    => Client::Service::DSP_PURETRACKS,
    'NEUROTIC / AMPLIFIED'             => Client::Service::DSP_NEUROTICMEDIA,
    'NAVIO SYSTEMS, INC.'              => Client::Service::DSP_NAVIO,
    'LA LA MEDIA, INC.'                => Client::Service::DSP_LALA,
    'FULL AUDIO/MUSICNOW'              => Client::Service::DSP_MUSICNOW,
    'CLEAR CHANNEL BROADCASTING, INC.' => Client::Service::DSP_CLEARCHANNEL,
    'CELLMANIA'                        => Client::Service::DSP_CELLMANIA,
);

my %fontana_formats = (
    'PERMANENT DOWNLOADS'                             => RPS::File::Sale::FORMAT_DOWNLOAD,
    'PERMANENT DOWNLOADS PROMO'                       => RPS::File::Sale::FORMAT_DOWNLOAD,
    'AD SUPPORTED STREAMS'                            => RPS::File::Sale::FORMAT_STREAM,
    'KIOSK'                                           => RPS::File::Sale::FORMAT_DOWNLOAD,
    'OTA PERMANENT DOWNLOADS'                         => RPS::File::Sale::FORMAT_DOWNLOAD,
    'PORTABLE SUB CLIENT PLAYS'                       => RPS::File::Sale::FORMAT_STREAM,
    'PORTABLE SUB DEVICE PLAYS'                       => RPS::File::Sale::FORMAT_STREAM,
    'PORTABLE SUB STREAMS'                            => RPS::File::Sale::FORMAT_STREAM,
    'PROGRAMMED STREAMING'                            => RPS::File::Sale::FORMAT_STREAM,
    'RINGBACKS'                                       => RPS::File::Sale::FORMAT_RINGTONE,
    'STANDARD MOBILE RINGSOUNDS'                      => RPS::File::Sale::FORMAT_RINGTONE,
    'STREAMS'                                         => RPS::File::Sale::FORMAT_STREAM,
    'SUBSCRIPTION MASTERTONES'                        => RPS::File::Sale::FORMAT_RINGTONE,
    'TETHERED/CONDITIONAL DOWNLOADS'                  => RPS::File::Sale::FORMAT_TETHERED,
    'VIDEO DOWNLOADS'                                 => RPS::File::Sale::FORMAT_DOWNLOAD,          # was FORMAT_VIDEO (FB1324)
    'USER GENERATED STREAMS (UMG AUDIO / USER VIDEO)' => RPS::File::Sale::FORMAT_STREAM,            # was FORMAT_VIDEOSTREAM (FB1324)
    'VIDEO STREAMS'                                   => RPS::File::Sale::FORMAT_STREAM,            # was FORMAT_VIDEOSTREAM (FB1324)
    'DRM FREE UPGRADE'                                => RPS::File::Sale::FORMAT_DOWNLOADUPGRADE,
    'MOBILE VIDEO STREAMING'                          => RPS::File::Sale::FORMAT_STREAM,            # was FORMAT_VIDEOSTREAM (FB1324)
    'OTA VIDEO DOWNLOADS'                             => RPS::File::Sale::FORMAT_DOWNLOAD,
    'PERM DL FROM OTA - W/O WHOLESALE'                => RPS::File::Sale::FORMAT_DOWNLOAD,
    'PROGRAMMED VIDEO STREAMING'                      => RPS::File::Sale::FORMAT_STREAM,            # was FORMAT_VIDEOSTREAM (FB1324)
    'SUBSCRIPTION OTA PERMANENT DOWNLOADS (AUDIO)'    => RPS::File::Sale::FORMAT_VPD,
);

my %field_map = (
    4 => {
        format  => 1,
        service => 2,
        type    => 4,
        artist  => 5,
        album   => 6,
        track   => 8,
        isrc    => 9,
        units   => 11,
        price   => 12,
    },
    5 => {
        format  => 3,
        service => 5,
        type    => 8,
        isrc    => 9,
        artist  => 10,
        track   => 11,
        album   => 12,
        units   => 15,
        price   => 16,
    },
    6 => {
        label   => 0,
        format  => 3,
        service => 5,
        type    => 8,
        upc     => 9,
        artist  => 10,
        album   => 11,
        units   => 16,
        price   => 17,
    },
);

#public methods

sub _importLines {
    my $self = shift;
    my %args = @_;

    my $lines    = $args{lines};
    my $version  = $args{file}->VersionNum();
    my $fileName = $args{file}->OrigFileName();

    return undef unless ($lines);

    my $gross_total = 0;

    my $linenum = 1;

    my $offsets = $field_map{$version};
    my %errors  = ();

    #$canadian_dollar = 1 if($fileName =~ /^CAD_/);

    my ( $dateBegin, $dateEnd ) = $self->_getDates($fileName);

    unless ( $dateBegin && $dateEnd ) {
        $self->errstr("couldn't get dates from filename: $fileName");
        print STDERR "$fileName\n";
        return undef;
    }

    foreach my $line (@$lines) {

        my $serviceName = $line->[ $offsets->{service} ];
        $serviceName =~ s/\s-\s\w+.*$//;
        $serviceName =~ s/\ssubscription.*$//i;
        $serviceName =~ s/\sdownload.*$//i;
        my $serviceID = $self->getServiceID($serviceName) || $service_map{$serviceName};

        my $strippedServiceName = $serviceName =~ s/\s/_/g;
        $serviceID = $self->getServiceID($strippedServiceName)
          || $service_map{$strippedServiceName}
          if ( $serviceID eq "" );

        my $artist = $line->[ $offsets->{artist} ];
        my $album  = $line->[ $offsets->{album} ];
        my $track  = $line->[ $offsets->{track} ];

        my $isrc          = Common::Util::normalize_isrc( $line->[ $offsets->{isrc} ] );
        my $upc           = Common::Util::normalize_upc( $line->[ $offsets->{upc} ] );
        my $label         = $line->[ $offsets->{label} ] if ( defined( $offsets->{label} ) );
        my ($units)       = $line->[ $offsets->{units} ];
        my ($total_price) = $line->[ $offsets->{price} ];

        if ( $units eq "" ) {
            $linenum++;
            next;
        }

        $total_price =~ s/(\-?\$?\,)//g;

        my $price = $total_price / $units if ( defined $total_price && defined $units && $units != 0 );

        my $type;
        if ( $line->[ $offsets->{type} ] =~ /track/i ) {
            $type = RPS::File::Sale::TYPE_TRACK;
        } elsif ( $line->[ $offsets->{type} ] =~ /album/i ) {
            $type = RPS::File::Sale::TYPE_ALBUM;
        } elsif ( ( $line->[ $offsets->{type} ] =~ /sold as/i )
            || $line->[ $offsets->{type} ] eq "" ) {
        } else {
            unless ( $errors{$type} ) {
                $self->errstr( "unknown type: " . $line->[ $offsets->{type} ] . " at line number: $linenum" );
                print STDERR "type: " . $line->[ $offsets->{type} ] . "\n";
                $errors{$type} = 1;
            }

            #return undef;
        }

        my $formatName = $line->[ $offsets->{format} ];
        my $format     = $fontana_formats{$formatName};

        #my $free = ($formatName =~ m/^promotional use$/i) ? 1 : 0;
        my $free = ( $formatName =~ m/promo/i ) ? 1 : 0;

        if ($free) {
            $price = 0;
        }

        my $mediaType;

        if (   $formatName =~ /^video downloads$/i
            || $formatName =~ /^user generated streams \(umg audio \/ user video\)$/i
            || $formatName =~ /^video streams$/i
            || $formatName =~ /^mobile video streaming$/i
            || $formatName =~ /^programmed video streaming$/i ) {
            $mediaType = RPS::DB::Item::MediaType::kMediaTypeVideo;
        } else {
            $mediaType = RPS::DB::Item::MediaType::kMediaTypeAudio;
        }

        if ( $units && $album && $artist && defined $price && $type ) {
            unless ($format) {
                unless ( $errors{$formatName} ) {
                    $self->errstr("unknown format $formatName at line number: $linenum");
                    print STDERR "Format: $formatName\n";
                    $errors{$formatName} = 1;
                }
                return undef;
            }
            unless ($serviceID) {
                unless ( $errors{$serviceName} ) {
                    $self->errstr( 'Unknown service:' . $serviceName . "at line number: $linenum" );
                    print STDERR "unknown service: " . $line->[ $offsets->{service} ] . " - " . $serviceName . "\n";
                    $errors{$serviceName} = 1;
                }
                return undef;
            }
            my $sale = RPS::Import::SaleRec->new();

            $sale->serviceID($serviceID);

            $sale->mediaType($mediaType);

            $sale->labelName($label);
            $sale->productType($type);
            $sale->formatType($format);
            $sale->dateBegin($dateBegin);
            $sale->dateEnd($dateEnd);
            $sale->isrc($isrc) if ( $type eq RPS::File::Sale::TYPE_TRACK );
            $sale->upc($upc) if ( $upc && ( $version == 6 ) );
            $sale->artistName($artist);
            $sale->albumName($album);
            $sale->trackName($track) if ( $type eq RPS::File::Sale::TYPE_TRACK );
            $sale->units($units);
            $sale->price($price);
            $sale->free($free);
            $sale->lineNum($linenum);
            $sale->countryCode('US');

            #if (1 == $canadian_dollar)
            #{
            #    $sale->currencyCode('CAD');
            #}
            #else
            #{
            #    $sale->currencyCode('USD');
            #}
            #if(defined $offsets->{currency} && $line->[$offsets->{currency}] ne "") {
            #    $sale->currencyCode(uc($line->[$offsets->{currency}]));
            #}
            #
            # !!! We'll let the inherited code decide how to set the conversion_rate.

            #$args{dumper}($sale);  ## for cmd-line testing
            $self->_insertSale( sale => $sale );
        }

        #else { print STDERR "skipped: u($units) album($album) artist($artist) price($price) type($type)\n"; }

        $linenum++;
    }

    return $linenum;
}

#
# Private methods
#

sub _getDates {
    my $self        = shift;
    my $passed_date = shift;

    my $year;
    my $month;

    #return undef if ($year eq '' || $month eq '' || $year > 3000 || $year < 2000);

    my ( $dateBegin, $dateEnd );

    if ( $passed_date =~ /(\d\d)(\d\d)\./ ) {
        $month = $1;
        $year  = 2000 + $2;
    } elsif ( $passed_date =~ /(\d{2})\D(\d{2})\D(\d{2})/ ) {
        $month = $1;
        $year  = 2000 + $3;
    } elsif ( $passed_date =~ /(\d{2})\D(\d{4})/ ) {
        $month = $1;
        $year  = $2;
    } else {
        return undef;
    }

    $dateBegin = sprintf( "%04d-%02d-%02d", $year, $month, 1 );
    $dateEnd = sprintf( "%04d-%02d-%02d", $year, $month, Days_in_Month( $year, $month ) );

    return ( $dateBegin, $dateEnd );

}

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