package RPS::Import::Musiwave1;

use strict;

use Date::Calc qw(Days_in_Month);

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

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

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

my %field_map = (
    1 => {
        title               => 0,
        artist              => 0,
        service_product_id  => 1,
        label               => 2,
        fee_percentage      => 1,
        period              => 1,
        min                 => 4,
        norm                => 5,
        min_fee             => 6,
        norm_fee            => 7,
        total_revenue       => 8,
        service_name        => 1,
        service_country     => 2,
    },
    2 => {
        title               => 0,
        artist              => 1,
        service_product_id  => 2,
        label               => 3,
        isrc                => 4,
        fee_percentage      => 1,
        period              => 1,
        min                 => 4,
        norm                => 5,
        min_fee             => 6,
        norm_fee            => 7,
        total_revenue       => 8,
        service_name        => 1,
        service_country     => 2,
    },
    3 => {
        title               => 0,
        service_product_id  => 1,
        artist              => 2,
        label               => 3,
        isrc                => 4,
        fee_percentage      => 1,
        period              => 1,
        min                 => 4,
        norm                => 5,
        min_fee             => 6,
        norm_fee            => 7,
        total_revenue       => 8,
        service_name        => 1,
        service_country     => 2,
    },
    5 => {
        title               => 0,
        service_product_id  => 1,
        artist              => 2,
        label               => 3,
        fee_percentage      => 7,
        period              => 1,
        norm                => 4,
        norm_fee            => 5,
        total_revenue       => 8,
        service_name        => 0,
        service_country     => 1,
    },
    6 => {
        label               => 0,
        artist              => 1,
        title               => 2,
        fee_percentage      => 7,
        norm                => 4,
        norm_fee            => 5,
        total_revenue       => 8,
        service_name        => 0,
        service_country     => 1,
    },
);

my %delivery_formats = (
    'Download'              => RPS::File::Sale::FORMAT_DOWNLOAD,
    'Stream'                => RPS::File::Sale::FORMAT_STREAM,
    'Limited Download'      => RPS::File::Sale::FORMAT_DOWNLOAD,
    'Over the Air Download' => RPS::File::Sale::FORMAT_DOWNLOAD,
    'Ringtone'              => RPS::File::Sale::FORMAT_RINGTONE,
    'Ringback'              => RPS::File::Sale::FORMAT_RINGBACK,
    'Over the Air Download' => RPS::File::Sale::FORMAT_DOWNLOAD,
    'Burn'                  => RPS::File::Sale::FORMAT_DOWNLOAD,
    'Other'                 => RPS::File::Sale::FORMAT_STREAM,
    'Play'                  => RPS::File::Sale::FORMAT_STREAM,
    'Realtone'              => RPS::File::Sale::FORMAT_RINGTONE,
);

my %countries = (
    'AM-SP-epw'     => 'SP',
    'AOL-FR'        => 'FR',
    'BOU-FR'        => 'FR',
    'BOU-FR-wap'    => 'FR',
    'eTF1-FR'       => 'FR',
    'MOB-BE'        => 'BE',
    'MUSI_COM-FR'   => 'FR',
    'NRJ-FR'        => 'FR',
    'O2-IR'         => 'IR',
    'O2-UK'         => 'GB',
    'OPT-PR-oz'     => 'PT',
    'OPT-PT'        => 'PT',
    'ORA-CH'        => 'CH',
    'ORA-FR'        => 'FR',
    'SAG-99'        => 'FR',
    'SAG-BE-fr'     => 'FR',
    'SAG-BE-nl'     => 'BE',
    'SAG-DE'        => 'DE',
    'SAG-FR'        => 'FR',
    'SAG-FR-bg'     => 'FR',
    'SAG-FR-og'     => 'FR',
    'SAG-FR-sg'     => 'FR',
    'SAG-SP'        => 'SP',
    'SAG-UK'        => 'GB',
    'SFR-FR'        => 'FR',
    'SFR-FR'        => 'FR',
    'SMS-FR'        => 'FR',
    'TEL-SP'        => 'SP',
    'TEL-SP'        => 'SP',
    'TM-UK'         => 'GB',
    'VOD-AU'        => 'AU',
    'VOD-DE'        => 'DE',
    'VOD-HU'        => 'HU',
    'VOD-IT'        => 'IT',
    'VOD-NZ'        => 'NZ',
    'VOD-PT'        => 'PT',
    'VOD-SP'        => 'SP',
    'VOD-UK'        => 'GB',
    'VOD-ZA'        => 'ZA',
    'WAN-FR'        => 'FR',
);

my %services = (
    'AMENA-SP'                      => 'AM-SP-EPW',
    'AMENA-SPAIN'                   => 'AM-SP-EPW',
    'AMENA FNAC'                    => 'AM-SP-EPW',
    'AMENA MUSIC-ON'                => 'AM-SP-EPW',
    'AOL-FRANCE'                    => 'AOL-FR-DS',
    'AOL-FR'                        => 'AOL-FR-WE',
    'AOL WEB'                       => 'AOL-FR-ZX',
    'BOUYGUES-FR'                   => 'BOU-FR-JK',
    'BOUYGUES WAP-FR'               => 'BOU-FR-KJ',
    'BOUYGUES IMODE'                => 'BOU-FR-WAP',
    'BOUYGUES WAP'                  => 'BOU-FR-WAP',
    'BOUYGUES TELECOM-FRANCE'       => 'BOU-FR-WAP',
    'ETF1'                          => 'TF1-FR',
    'ETF1-FRANCE'                   => 'TF1-FR',
    'MOBIBASE'                      => 'MOE-BE',
    'MOBISTAR'                      => 'MOB-BE',
    'MOBISTAR BE'                   => 'MOB-BE',
    'MOBISTAR-BELGIUM'              => 'MOB-BE',
    'MP3.FR'                        => 'MP3-FR',
    'MUSIWAVE.COM-FRANCE'           => 'MUSI_COM-FR',
    'MUSIWAVE.COM-FR'               => 'MUSI_COM-FR',
    'MUSIWAVE.COM'                  => 'MUSI_COM-FR',
    'NRJ-FRANCE'                    => 'NRJ-FR',
    'NRJ PERSONNALISATION'          => 'NRJ-FR',
    'O2-IRELAND'                    => 'O2-IR',
    'O2-UK'                         => 'O2-UK',
    'O2 UK IMODE RINGTONES'         => '02-UK',
    'OP ALCATEL / ORANGE GALLERY'   => 'ORA-FR-JH',
    'OPTIMUS'                       => 'OPT-PT',
    'OPTIMUS OZONE'                 => 'OPT-PT',
    'OPTIMUS-PORTUGAL'              => 'OPT-PT-OZ',
    'ORANGE GALLERY'                => 'ORA-FR',
    'ORANGE-FRANCE'                 => 'ORA-FR',
    'ORANGE CH'                     => 'ORA-CH',
    'ORANGE-CH'                     => 'ORA-CH',
    'ORANGE-SWITZERLAND'            => 'ORA-CH',
    'PLANET SAGEM-FRANCE'           => 'SAG-FR',
    'PLANETSAGEM-AT'                => 'SAG-AT',
    'PLANETSAGEM-BE'                => 'SAG-BE',
    'PLANETSAGEM-DE'                => 'SAG-DE',
    'PLANETSAGEM-EI'                => 'SAG-EI',
    'PLANETSAGEM-DOMTOM'            => 'SAG-FR-WE',
    'PLANETSAGEM-FR'                => 'SAG-FR',
    'PLANETSAGEM-SP'                => 'SAG-SP',
    'PLANETSAGEM-UK'                => 'SAG-UK',
    'PUSH SMS-FRANCE'               => 'SMS-FR',
    'SAGEM / BOUYGUES GALLERY-FRANCE' => 'SAG-FR-BG',
    'SAGEM / BOUYGUES GALLERY'      => 'SAG-FR-BG',
    'SAGEM / BG GALLERY'            => 'SAG-FR-BFG',
    'SAGEM FRANCE'                  => 'SAG-FR-OG',
    'SAGEM - ORANGE GALLERY'        => 'SAG-FR-BG',
    'SAGEM / OG GALLERY'            => 'SAG-FR-HB',
    'SAGEM / ORANGE GALLERY'        => 'SAG-FR-BG',
    'SAGEM / ORANGE GALLERY-FRANCE' => 'SAG-FR-OG',
    'SAGEM / SFR GALLERY'           => 'SAG-FR-SG',
    'SFR'                           => 'SFR-FR',
    'SFR - MUSIWAVE'                => 'SFR-FR',
    'SFR-FRANCE'                    => 'SFR-FR',
    'TELEFONICA'                    => 'TEL-SP',
    'TELEFONICA TONOS REALES'       => 'TEL-SP',
    'TELEFONICA WAP'                => 'TEL-SP',
    'TELEFONICA-SPAIN'              => 'TEL-SP',
    'T-MOTION'                      => 'TM-UK',
    'VODAFONE AU-AUSTRALIA'         => 'VOD-AU',
    'VODAFONE DE-GERMANY'           => 'VOD-DE',
    'VODAFONE HU-HUNGARY'           => 'VOD-HU',
    'VODAFONE IT-ITALY'             => 'VOD-IT',
    'VODAFONE NZ-NEW ZEALAND'       => 'VOD-NZ',
    'VODAFONE PT-PORTUGAL'          => 'VOD-PT',
    'VODAFONE SP-SPAIN'             => 'VOD-SP',
    'VODAFONE ZA-SOUTH AFRICA'      => 'VOD-ZA',
    'VODAFONE FNAC'                 => 'VOD-FR',
    'VODAFONE IT'                   => 'VOD-IT',
    'VODAFONE LIVE AU REALTONE'     => 'VOD-AU',
    'VODAFONE LIVE AU TONESTORE'    => 'VOD-AU',
    'VODAFONE LIVE DE'              => 'VOD-DE',
    'VODAFONE LIVE NEW ZEALAND TONE'=> 'VOD-NZ',
    'VODAFONE LIVE NZ REALTONE'     => 'VOD-NZ',
    'VODAFONE LIVE SPAIN'           => 'VOD-SP',
    'VODAFONE LIVE SPAIN CAL'       => 'VOD-SP',
    'VODAFONE PORTUGAL'             => 'VOD-PT',
    'VODALIVE!-AU'                  => 'VOD-AU',
    'VODALIVE!-HU'                  => 'VOD-HU',
    'VODALIVE!-IT'                  => 'VOD-IT',
    'VODALIVE!-DE'                  => 'VOD-DE',
    'VODALIVE!-NZ'                  => 'VOD-NZ',
    'VODALIVE!-PT'                  => 'VOD-PT',
    'VODALIVE!-SOUTH AFRICA'        => 'VOD-ZA',
    'VODALIVE!-SW'                  => 'VOD-SW',
    'VODALIVE!-SP'                  => 'VOD-SP',
    'VODALIVE!-UK'                  => 'VOD-UK',
    'WANADOO'                       => 'WAN-FR',
    'WANADOO-FRANCE'                => 'WAN-FR',
);

my %alt_services = (
    'AMENA FNAC'                    => 'AM-SP-EPW',
    'AMENA MUSIC-ON'                => 'AM-SP-EPW',
    'AOL WEB'                       => 'AOL-FR',
    'BOUYGUES IMODE'                => 'BOU-FR-WAP-D',
    'BOUYGUES WAP'                  => 'BOU-FR-WAP-F',
    'ESPACE PERSO WAP CAZACANCIONES'=> 'TFR1-FR-S',
    'ETF1'                          => 'TFR1-FR-D',
    'MOBISTAR BE'                   => 'MOB-BE',
    'MUSIWAVE.COM'                  => 'MUSI_COM-FR',
    'NRJ PERSONNALISATION'          => 'NRJ-FR',
    'O2 UK IMODE RINGTONES'         => 'O2-UK',
    'OPTIMUS OZONE'                 => 'OPT-PT',
    'ORANGE CH'                     => 'ORA-FR',
    'ORANGE GALLERY'                => 'ORA-FR-R',
    'SAGEM - ORANGE GALLERY'        => 'SAG-FR-FG',
    'SAGEM / BOUYGUES GALLERY'      => 'SAG-FR-OG',
    'SAGEM / SFR GALLERY'           => 'SAG-FR-SG',
    'SAGEM FRANCE'                  => 'SAG-FR',
    'SFR - MUSIWAVE'                => 'SFR-FR',
    'TELEFONICA TONOS REALES'       => 'TEL-SP',
    'TELEFONICA WAP'                => 'TEL-SP-A',
    'VODAFONE FNAC'                 => 'VOD-FR',
    'VODAFONE IT'                   => 'VOD-IT',
    'VODAFONE LIVE AU REALTONE'     => 'VOD-AU',
    'VODAFONE LIVE AU TONESTORE'    => 'VOD-AU-X',
    'VODAFONE LIVE DE'              => 'VOD-DE',
    'VODAFONE LIVE NEW ZEALAND TONE'=> 'VOD-NZ',
    'VODAFONE LIVE NZ REALTONE'     => 'VOD-NZ-C',
    'VODAFONE LIVE SPAIN CAL'       => 'VOD-SP',
    'VODAFONE LIVE SPAIN'           => 'VOD-SP-V',
    'VODAFONE PORTUGAL'             => 'VOD-PT',
    'WANADOO'                       => 'WAN-FR',
);


my @data_delivery_formats = ('Download','Stream','Burn','Limited Download','Other','Play');

#
# public methods
#

sub _importLines
{
    my $self = shift;
    my %args = @_;
    my $lines = $args{lines};
    return undef unless ($lines);
    my $version = $args{file}->VersionNum();
    my $fileName = $args{file}->OrigFileName();
    #my $version = $args{version}; # cmd-line testing
    #my $fileName = $args{OrigFileName}; # cmd-line testing
    my %buffer = ();
    my $linenum = 1;
    my $format = RPS::File::Sale::FORMAT_RINGTONE;
    my $sheet_count = 0;
    my $revenue_caught = 0;
    my $start_column = 0;
    my $column_count = 0;
    my $found_start = 0;
    my $last_artist;
    my (%errors,@columns,$this_column,$album,$dateBegin,$dateEnd,$total_columns,$fee_percentage,$x,$y);
#print STDERR "Version: ". $version . "\n";

    foreach my $sheet(@{ $args{sheets} }) {
#print STDERR "Sheet Count: ". $sheet_count . "\n";
        my $linenum = 1;
        foreach my $line (@$sheet)
        {
            #my $artist      = $line->[$field_map{$version}{artist}];
            #my $isrc        = $line->[$field_map{$version}{isrc}];
            #my $title       = $line->[$field_map{$version}{title}];
            my $service     = "";
            if($sheet_count == 0) {
                if($linenum == 1 && $version < 5) {
                    $fee_percentage = $line->[$field_map{$version}{fee_percentage}];
                }
                elsif($linenum == 9 && $version > 4) {
                    $fee_percentage = $line->[$field_map{$version}{fee_percentage}];
                }
                elsif($line->[1] =~ /Period \=/) {
                    ($dateBegin,$dateEnd) = _get_dates($line->[1]);
                }
                elsif($line->[$field_map{$version}{service_name}] ne "" && $line->[$field_map{$version}{service_name}] !~ /Period/ && $line->[$field_map{$version}{service_name}] !~ /Services/ && $line->[$field_map{$version}{service_name}] !~ /\.(\d+)/) {
                    my $test_service_name = uc($line->[$field_map{$version}{service_name}]);
                    my $alt_service_name = uc($line->[$field_map{$version}{service_name}]) . "-" . uc($line->[$field_map{$version}{service_country}]);
                    if(!$services{$test_service_name}) {
                        if(!$services{$alt_service_name} && $alt_service_name !~ /[total]/i) {
                            #return undef;
                            $self->errstr("Could not find: " . $test_service_name . " or " . $alt_service_name . "\n"); 
                        }
                        else {
                            $service = $services{$alt_service_name};
                        }
                    }
                    else {
                         $service = $services{$test_service_name};
                    }
                    if($service ne "" && $revenue_caught == 0) {
                        $buffer{uc($service)}{'combined_revenue'} = $line->[$field_map{$version}{total_revenue}];
                        $buffer{uc($service)}{'name'} = uc($service);
                        my $price = $line->[$field_map{$version}{norm}]*$fee_percentage;
                        if($field_map{$version}{min} > 0) {
                            $price = $line->[$field_map{$version}{min}]*$fee_percentage if (($line->[$field_map{$version}{min_fee}] ne "")&&($line->[$field_map{$version}{min}] ne ""));
                        }
                        $buffer{uc($service)}{'unit_price'} = $price;
                    }
                }
                elsif($line->[5] eq "Events") {
                    $revenue_caught = 1;
                }
            }
            elsif($sheet_count == 1) {
                if(($line->[0] =~ /name/i ||$line->[0] =~ /^title/i || $line->[0] =~ /^licensor/i)&&($found_start==0)&&($line->[0] ne "")) {
                    @columns = @$line;
                    $start_column = 0;
                    foreach $this_column(@columns) {
                        $found_start = 1 if($this_column =~ /Number of/i);
                        $found_start = 1 if($this_column eq "" && $version == 6);
                        $start_column++ if($found_start == 0);
                    }
                    for (my $x=0;$x<$start_column;$x++) {
                        shift @columns;
                    }
                    $column_count = $start_column;
                    foreach $this_column(@columns) {
                        if($version == 6) {
                            my $tmp_column = $alt_services{uc($this_column)};
                            $this_column = $tmp_column;
                        }
                        $this_column =~ s/\(.*\)//;
                        $this_column =~ s/[^\w\-]+//g;
                        if($this_column ne "") {
                            $buffer{uc($this_column)}{'column'} = $column_count;
                        }
                        $column_count++;
                    }
                }
                elsif($line->[1] ne "") {
                    my ($artist,$title);
                    ($artist,$title) = split(" - ",$line->[$field_map{$version}{artist}]) if ($version==1);
                    $artist = $line->[$field_map{$version}{artist}] if ($version > 1);
                    $title = $line->[$field_map{$version}{title}] if ($version > 1);
                    $artist = $last_artist if($artist eq "" && $last_artist ne "" && $version == 6);
                    my $customer_product_id = $line->[$field_map{$version}{service_product_id}];
                    my $label = $line->[$field_map{$version}{label}];
                    my $total_units = $line->[$start_column];
                    my $service_product_id = $line->[$field_map{$version}{service_product_id}];
                    foreach $this_column(@columns) {
                        if(($this_column ne "")&&($this_column !~ /numberofd/i)&&($line->[$buffer{uc($this_column)}{'column'}]>0)) {
                            $this_column =~ s/[^\w\-]+//g;
                            my $units = $line->[$buffer{uc($this_column)}{'column'}];
                            my ($service,$country) = split("-",$this_column);
                            $country =~ s/domtom/FR/i;
                            $country =~ s/99/FR/i;
                            my $sale = RPS::Import::SaleRec->new();
                            $sale->productType(RPS::File::Sale::TYPE_TRACK);
                            $sale->formatType($format);
                            $sale->trackName($title);
                            $sale->dateBegin($dateBegin);
                            $sale->dateEnd($dateEnd);
                            $sale->serviceProductID($service_product_id) if($service_product_id);
                            $sale->artistName($artist);
                            $sale->labelName($label);
                            $sale->price($buffer{uc($this_column)}{'unit_price'});
                            $sale->units($units);
                            $sale->currencyCode('EUR');
                            $sale->serviceProductID($customer_product_id);
                            $sale->countryCode($country);
                            $sale->lineNum($linenum);
                            #$args{dumper}($sale); ## for cmd-line testing
                            $self->_insertSale(sale => $sale);
                            $last_artist = $artist;
                        }
                        #else { print STDERR "Skip-> i: ". $buffer{uc($this_column)}{'column'} . " u: " . $units . " tc: " . $this_column . "\n"; }
                    }
                }
            }
           $linenum++;
       }
       $sheet_count++;
    }
    return 1;
}

#
# Private methods
#

sub _get_dates
{
    my $passed_date = shift;
    my %months = (
        'Jan'       => '01',
        'January'   => '01',
        'Feb'       => '02',
        'February'  => '02',
        'Mar'       => '03',
        'March'     => '03',
        'Apr'       => '04',
        'April'     => '04',
        'May'       => '05',
        'June'      => '06',
        'July'      => '07',
        'August'    => '08',
        'Septembre' => '09',
        'September' => '09',
        'Octobre'   => '10',
        'October'   => '10',
        'November'  => '11',
        'Novembre'  => '11',
        'December'  => '12',
        'Decembre'  => '12',
    );
    $passed_date =~ s/^.*\= //;
    return undef unless ($passed_date =~ m/(\w+)\D(\d{2})/);
    my ($month, $year) = ($1, $2);
    $year += 2000;
    return (
        sprintf("%04d-%02d-01", $year, $months{$month}), 
        sprintf("%04d-%02d-%02d", $year, $months{$month}, Days_in_Month($year, $months{$month}))
    );
}

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