package RPS::Import::NineSquaredVarTab;

use strict;

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

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

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

#private constants
use constant FIELD_STARTDATE => 10;
use constant FIELD_ENDDATE   => 17;

use constant FIELD_VENDORID   => 1;
use constant FIELD_PRODUCT    => 2;
use constant FIELD_PLATFORM   => 5;
use constant FIELD_ISRC       => 12;
use constant FIELD_SERVICE    => 20;
use constant FIELD_ARTIST     => 24;
use constant FIELD_TITLE      => 25;
use constant FIELD_SALEPRICE  => 26;
use constant FIELD_UNITS      => 27;
use constant FIELD_TOTALPRICE => 30;

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

#public methods

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

    #
    # Variable-tab 9 Squared file with amazingly consistant
    # headers in each tab.
    #
    my $retval      = undef;
    my $sheets      = $args{sheets};
    my $fileObj     = $args{file};
    my $sheet_names = $args{sheet_names};

    if ( $self->{clientID} == 21 )    # warner
    {
        $fileObj->Atomic(1);
        $fileObj->Save();
        print STDERR "set to atomic\n";
    }

    unless ($sheets) {
        print STDERR "sheet problem\n";
        return undef;
    }
    my $sheet_num = 0;

    foreach my $sheet (@$sheets) {

        #print STDERR "sheet is ".$sheet_names->[$sheet_num]."\n";
        if ( $sheet_names->[$sheet_num] eq "Summary" ) {
            $sheet_num++;
            next;
        }

        my $dateBegin;
        my $dateEnd;
        my $header_matched = 0;

        my $linenum = 1;
        foreach my $line (@$sheet) {
            if ( !$header_matched ) {
                $header_matched = matchHeader($line);
                next if ($header_matched);
            }

            if ( $linenum == 2 ) {
                my $start_date_raw = Spreadsheet::ParseExcel::Utility::ExcelFmt( "yyyy-mm-dd", $line->[FIELD_STARTDATE] );
                my $end_date_raw   = Spreadsheet::ParseExcel::Utility::ExcelFmt( "yyyy-mm-dd", $line->[FIELD_ENDDATE] - 1 );

                if ( $start_date_raw =~ /^\d\d\d\d-\d\d-\d\d$/ && $end_date_raw =~ /^\d\d\d\d-\d\d-\d\d$/ ) {
                    $dateBegin = $start_date_raw;
                    $dateEnd   = $end_date_raw;
                }

                #print STDERR "dates: $dateBegin and $dateEnd\n";

            } elsif ( $dateBegin && $dateEnd && $header_matched ) {
                my $prodtype = RPS::File::Sale::TYPE_TRACK;
                my ( $format, $priceType, $service_id );
                if ( $self->{clientID} == 21 ) {    # warner
                    next if ( $line->[FIELD_PLATFORM] eq "" || $line->[FIELD_PRODUCT] eq "" );
                    my $provider_type = $line->[FIELD_PLATFORM] . " " . $line->[FIELD_PRODUCT];
                    $format    = RPS::Import::WMG::Util::getWirelessFormatTypeID($provider_type);
                    $priceType = RPS::Import::WMG::Util::getWirelessPriceType($provider_type);
                    unless ( $format && $priceType ) {
                        $self->errstr("unknown format: $provider_type");
                        return undef;
                    }
                    my $service_name = $line->[FIELD_SERVICE];
                    $service_name = "9 SQUARED"           if ( $service_name eq "test" );
                    $service_name = "mTat2 Brew Motorola" if ( $service_name eq "mTat2 Brew Motorola/Alltel" );
                    $service_id   = RPS::Import::Importer->getServiceID($service_name);
                    unless ($service_id) {
                        $self->errstr("unknown service: $service_name");
                        return undef;
                    }
                    my @billTo = RPS::Import::WMG::Util::getWirelessBillto( $self->{fileServiceID} );

                    #my @billTo = RPS::Import::WMG::Util::getWirelessBillto(20);
                    my @sellTo = RPS::Import::WMG::Util::getWirelessSellto( $service_id, $billTo[0] );
                    unless ( $billTo[0] && $sellTo[0] ) {
                        $self->errstr( "no billto/sellto mapping for " . $self->{fileServiceID} . ": $service_name" );
                        return undef;
                    }
                } else {
                    $format = RPS::File::Sale::FORMAT_RINGTONE;
                }

                ##next;  #### DEBUG TESTS ONLY

                my $vendorID    = $line->[FIELD_VENDORID];
                my $artist      = $line->[FIELD_ARTIST];
                my $track       = $line->[FIELD_TITLE];
                my $isrc        = $line->[FIELD_ISRC];
                my $units       = $line->[FIELD_UNITS];
                my $retail      = $line->[FIELD_SALEPRICE];
                my $total_price = $line->[FIELD_TOTALPRICE];
                my $price       = $total_price / $units if ( $units > 0 );
                my $ppdRate     = ( defined $retail && $retail != 0 ) ? ( $price / $retail ) : '';

                if ( $units && $price && $artist && $track ) {
                    my $sale = RPS::Import::SaleRec->new();

                    $sale->productType($prodtype);
                    $sale->formatType($format);
                    $sale->dateBegin($dateBegin);
                    $sale->dateEnd($dateEnd);
                    $sale->serviceProductID($vendorID);
                    $sale->isrc($isrc);
                    $sale->artistName($artist);
                    $sale->trackName($track);
                    $sale->units($units);
                    $sale->price($price);
                    $sale->retail($retail)         if ( $self->{clientID} == 21 );
                    $sale->priceType($priceType)   if ( $self->{clientID} == 21 );
                    $sale->wholesaleRate($ppdRate) if ( $self->{clientID} == 21 );
                    $sale->serviceID($service_id)  if ( $self->{clientID} == 21 );
                    $sale->lineNum($linenum);

                    $self->_insertSale( sale => $sale );
                }

                #else { print STDERR "skipping u: $units , p: $price , a: $artist , t: $track\n"; }
            }
            $linenum++;
        }    # foreach line
        $retval += $linenum;
        $sheet_num++;
    }    # foreach sheet

    return $retval;
}

#
# Private methods
#

sub matchHeader {
    my $line = shift;

    # verify the column headings are as we expect them
    my $artist = $line->[FIELD_ARTIST];
    my $track  = $line->[FIELD_TITLE];
    my $units  = $line->[FIELD_UNITS];
    my $price  = $line->[FIELD_ISRC];

    if (   $artist =~ /author/i
        && $track =~ /product/i
        && $units =~ /units/i
        && $price =~ /isrc/i ) {
        return 1;
    }
    return 0;
}

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