package RPS::Import::VidZoneDigital2_Revised;

use strict;
use Data::Dumper;

use Date::Calc qw(Days_in_Month Decode_Month);
use Spreadsheet::ParseExcel;

use lib '/app/tools/common/lib';
use Common::Util qw(normalize_date);
use Common::Consts;
use Common::Country;

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

my %field_map = (
    2 => {
        isrc    => 0,
        artist  => 1,
        track   => 2,
        format  => 6,
        units   => 8,
        price   => 9,
        country => 10,
    },
    3 => {
        isrc      => 1,
        artist    => 2,
        track     => 3,
        format    => 11,
        units     => 13,
        price     => 14,
        country   => 7,
        sale_date => 12,
    },
    4 => {
        isrc      => 1,
        artist    => 2,
        track     => 3,
        format    => 10,
        units     => 12,
        price     => 13,
        country   => 6,
        sale_date => 11,
    },
);

my %service_map = ();

my %conversionRates = (
    "GB"  => 1,
    "We7" => 1,
);

my %formatMediaTypeMap = (
    "audiotrack"  => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeAudio ],
    "audio track" => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeAudio ],
    "dialtune"    => [ RPS::File::Sale::FORMAT_RINGTONE, RPS::DB::Item::MediaType::kMediaTypeAudio ],
    "dial tune"   => [ RPS::File::Sale::FORMAT_RINGTONE, RPS::DB::Item::MediaType::kMediaTypeAudio ],

    "musicvideo"   => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeVideo ],
    "music video"  => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeVideo ],
    "musicvideopc" => [ RPS::File::Sale::FORMAT_DOWNLOAD, RPS::DB::Item::MediaType::kMediaTypeVideo ],

    "realtune"         => [ RPS::File::Sale::FORMAT_RINGTONE, RPS::DB::Item::MediaType::kMediaTypeAudio ],
    "real tune"        => [ RPS::File::Sale::FORMAT_RINGTONE, RPS::DB::Item::MediaType::kMediaTypeAudio ],
    "streamingaudio"   => [ RPS::File::Sale::FORMAT_STREAM,   RPS::DB::Item::MediaType::kMediaTypeAudio ],
    "streamingaudiopc" => [ RPS::File::Sale::FORMAT_STREAM,   RPS::DB::Item::MediaType::kMediaTypeAudio ],

    "streamingvideo"    => [ RPS::File::Sale::FORMAT_STREAM, RPS::DB::Item::MediaType::kMediaTypeVideo ],
    "streamingvideopc"  => [ RPS::File::Sale::FORMAT_STREAM, RPS::DB::Item::MediaType::kMediaTypeVideo ],
    "tvchannel"         => [ RPS::File::Sale::FORMAT_STREAM, RPS::DB::Item::MediaType::kMediaTypeVideo ],    # FB1324
    "tv"                => [ RPS::File::Sale::FORMAT_STREAM, RPS::DB::Item::MediaType::kMediaTypeVideo ],    # FB1324
    "on demand"         => [ RPS::File::Sale::FORMAT_STREAM, RPS::DB::Item::MediaType::kMediaTypeVideo ],    # FB1324
    "on demand stream"  => [ RPS::File::Sale::FORMAT_STREAM, RPS::DB::Item::MediaType::kMediaTypeVideo ],
    "tv channel stream" => [ RPS::File::Sale::FORMAT_STREAM, RPS::DB::Item::MediaType::kMediaTypeVideo ],    # FB1324
);

my %countryMap = ( 'Virgin Islands British' => 'VG', );

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

#public methods

sub _importLines {
    my $self        = shift;
    my %args        = @_;
    my $fileObj     = $args{file};
    my $version     = $args{file}->VersionNum();
    my $fileName    = $args{file}->OrigFileName();
    my $offsets     = $field_map{$version};
    my $sheet_count = 0;
    return undef unless ( defined $args{sheets} && defined $version );

    my $sheet_names = $args{sheet_names};
    my $currency    = "GBP";

    my $linenum;

    my $dateBegin;
    my $dateEnd;
    if ( !defined $offsets->{'sale_date'} ) {
        ( $dateBegin, $dateEnd ) = $self->_getDates( date_begin => $fileName, type => "text" );
        unless ( $dateBegin && $dateEnd ) {
            print STDERR "Couldn't find dates from:" . $fileName . "\n";
            $self->errstr( "Couldn't find dates from:" . $fileName );
            return undef;
        }
    }

    foreach my $sheet ( @{ $args{sheets} } ) {
        if ( $sheet_names->[$sheet_count] =~ /summary/i ) {

            my ( $countryColumn, $conversionRateColumn );
            foreach my $line (@$sheet) {
                my $x = 0;
                foreach my $column (@$line) {
                    $countryColumn        = $x if ( $column =~ /territory/i );
                    $conversionRateColumn = $x if ( $column =~ /conversion rate/i );
                    $x++;
                }

                # If the territory is given as a full territory name, convert it
                # to a country code
                #
                my $countryCode;
                if ( $line->[$countryColumn] && $line->[$countryColumn] !~ /territory/i ) {
                    $countryCode = $line->[$countryColumn];

                    my $o = Common::Country->Get($countryCode);
                    if ($o) {
                        $countryCode = $o->alpha2;
                    }
                }

                # Store the conversion rate; this will be used when we start
                # processing the sales on the detail tabs.
                #
                if (   $countryColumn ne ""
                    && $countryCode ne ""
                    && $conversionRateColumn ne ""
                    && $line->[$conversionRateColumn] ne ""
                    && $line->[$conversionRateColumn] !~ /n\/a/i ) {
                    $conversionRates{$countryCode} = $line->[$conversionRateColumn];
                }
            }
        } elsif ( $sheet_names->[$sheet_count] !~ /summary/i ) {
            $linenum = 1;

            my $f_sheetName = $sheet_names->[$sheet_count];
            my $sheetName   = $f_sheetName;

            $sheetName =~ s/Sales //;
            $sheetName =~ s/roi/ireland/i;

            # The conversion rate information (taken from the 'summary' sheet) is
            # generally keyed by country code, not tab name.  However, for 'xbox'
            # and 'We7' we use the tab name.
            #
            my $sheetConvCode;

            $sheetName = $countryMap{$sheetName} || $sheetName;

            if ( my $o = Common::Country->Get($sheetName) ) {
                $sheetConvCode = $o->alpha2;
            }

            if ( !$sheetConvCode ) {
                if ( $sheetName =~ /xbox/i ) {
                    $sheetConvCode = "XBOX";
                } elsif ( $sheetName =~ /We7/i ) {
                    $sheetConvCode = "We7";
                } elsif ( $sheetName =~ /playstation/i ) {
                    $sheetConvCode = "Playstation";
                } elsif ( $sheetName =~ /youtube/i ) {
                    $sheetConvCode = "YouTube";
                } else {
                    print STDERR "Couldn't get country code from tab name $f_sheetName\n";
                    $self->errstr("Couldn't get country code from tab name $f_sheetName\n");
                    return undef;
                }
            }

            my $conversionRate = $conversionRates{$sheetConvCode};

            my $headerFound;

            foreach my $line (@$sheet) {

                my $f_country = $line->[ $offsets->{'country'} ];

                $headerFound = 1 if ( $f_country && $f_country =~ m/territory/i );

                if ( !$headerFound || '' eq $f_country || $f_country =~ m/territory/i ) {
                    $linenum++;
                    next;
                }

                my $lineInfo = "sheet $f_sheetName, line $linenum";

                if ( defined $offsets->{'sale_date'} ) {
                    my $sdate = $line->[ $offsets->{'sale_date'} ];
                    if ( $sdate =~ m/^(\d+)$/ ) {
                        $sdate = Spreadsheet::ParseExcel::Utility::ExcelFmt( "yyyy-mm-dd", $sdate );
                    }

                    ( $dateBegin, $dateEnd ) = $self->_getDates( date_begin => $sdate );

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

                }

                my $countryCode;

                $f_country = $countryMap{$f_country} || $f_country;

                if ( my $o = Common::Country->Get($f_country) ) {
                    $countryCode = $o->alpha2;
                } else {
                    print STDERR "$lineInfo: Unknown country '$f_country'\n";
                    $self->errstr("$lineInfo: Unknown country '$f_country'");
                    return undef;
                }

                my $isrc     = $line->[ $offsets->{'isrc'} ];
                my $artist   = $line->[ $offsets->{'artist'} ];
                my $title    = $line->[ $offsets->{'track'} ];
                my $units    = $line->[ $offsets->{'units'} ];
                my $price    = $line->[ $offsets->{'price'} ];
                my $f_format = $line->[ $offsets->{'format'} ];

                $price =~ s/[^0-9.]//g;

                if ( $price && $units && $artist && $artist ne "ARTIST" && $title && $title ne "TITLE" ) {

                    #unless($formatMediaTypeMap{lc $f_format}){
                    #    $self->errstr("Unknown format '$f_format' at line number: $linenum");
                    #    print STDERR "Unknown format '$f_format' on sheet '$sheetName' at line number: $linenum\n";
                    #    return undef;
                    #}

                    unless ($countryCode) {
                        print STDERR "Unknown country '$f_country' at line number: $linenum\n";
                        $self->errstr("Uknown country '$f_country' at line number: $linenum");
                        return undef;
                    }

                    my ( $format, $mediaType ) = @{ $formatMediaTypeMap{ lc $f_format } }
                      if ( $formatMediaTypeMap{ lc $f_format } );

                    $price /= $conversionRate;

                    $price /= $units if ( $units != 0 );

                    my $sale = RPS::Import::SaleRec->new();
                    $sale->productType(RPS::File::Sale::TYPE_TRACK);
                    $sale->mediaType($mediaType);
                    $sale->formatType($format);
                    $sale->isrc($isrc);
                    $sale->dateBegin($dateBegin);
                    $sale->dateEnd($dateEnd);
                    $sale->currencyCode($currency);
                    $sale->countryCode($countryCode);
                    $sale->artistName($artist);
                    $sale->trackName($title);
                    $sale->units($units);
                    $sale->price($price);
                    $sale->lineNum($linenum);
                    $self->_insertSale( sale => $sale );
                }

     #            else { print STDERR "skip s:".$sheet_names->[$sheet_count]." l:".$linenum." u: $units p: $price a: $artist t: $title\n"; }

                $linenum++;
            }

        }
        $sheet_count++;
    }

    #print STDERR Dumper(\%conversionRates);

    return $linenum;
}

#
# Private methods
#

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