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