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