#------------------------------------------------------------
# Copyright (C) 2011 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package BookPub::Analytics::SnapshotAuthorsSummary;

use strict;
use warnings;

use Spreadsheet::WriteExcel;
use Data::Dumper;

use lib '/app/tools/common/lib';
use RSApache::Response::XSLT;
use Common::Assert;
use Common::XMLObject;
use Common::RSApp;
use Common::Log;
use Common::Country;

use lib '/app/tools/bookpub/lib';
use BookPub::Analytics::ReportLib;
use BookPub::Analytics::AuthorsSummaryReport;
use BookPub::Analytics::SnapshotUtils;

use base 'BookPub::Analytics::BaseExport';

my $snapshotData;

sub _init {
    my ( $self, %args ) = @_;

    $self->SUPER::_init(%args);
    $self->{data} = $self->_exportToVariable(%args);

    return $self;

}

sub _exportToVariable {
    my ( $self, %args ) = @_;

    my $tmp;
    my $col = 0;

    # We don't want to display Last Rank for custom periods.
    my $displayLastRank = 1;

    if ( $args{endPeriodParam} ) {
        $displayLastRank = 0;
    }

    $snapshotData->{xml} = BookPub::Analytics::AuthorsSummaryReport->new(
        longPage       => 1,
        periodType     => $args{periodType},
        periodParam    => $args{periodParam},
        endPeriodParam => $args{endPeriodParam},
        imprintID      => $args{imprintID},
        publisherID    => $args{publisherID},
        countryCode    => $args{countryCode},
        commandObj     => $args{commandObj},
    );

    # We're going to use some magic to open a filehandle to a variable.
    #
    open my $fh, '>', \my $str or die "Failed to open filehandle: $!";

    my $workbook = Spreadsheet::WriteExcel->new($fh);

    my $formatBold     = self->BookPub::Analytics::SnapshotUtils::setFBold($workbook);
    my $formatCurrency = self->BookPub::Analytics::SnapshotUtils::setFCurrency($workbook);
    my $formatNumber   = self->BookPub::Analytics::SnapshotUtils::setFNumber($workbook);
    my $formatPercent  = self->BookPub::Analytics::SnapshotUtils::setFPercent($workbook);
    my $formatItalics  = self->BookPub::Analytics::SnapshotUtils::setFItalics($workbook);

    my $worksheet1 = $workbook->add_worksheet( BookPub::Analytics::SnapshotUtils::authorsSummarySheetName() );

    # First worksheet, Top Authors
    my $row = 0;
    $tmp = BookPub::Analytics::SnapshotUtils::authorsSummaryTitle();
    $worksheet1->write( $row, 0, $tmp, $formatBold );
    $row += 2;

    $tmp = $self->BookPub::Analytics::SnapshotUtils::dateRangeFormat( $args{periodType}, $snapshotData );
    $worksheet1->write( $row, 0, $tmp );
    $row++;

    if ( defined $args{publisherID} ) {
        if ( $args{publisherID} eq 0 ) {
            $tmp = BookPub::Analytics::SnapshotUtils::unspecifiedLabel();
        } else {
            $tmp = $snapshotData->{xml}{Publisher}{PublisherName};
        }
    } else {
        $tmp = BookPub::Analytics::SnapshotUtils::allPublishersLabel();
    }
    $worksheet1->write( $row, 0, $tmp );
    $row++;

    if ( defined $args{imprintID} ) {
        $tmp = $snapshotData->{xml}{Imprint}{ImprintName};
    } else {
        $tmp = BookPub::Analytics::SnapshotUtils::allImprintsLabel();
    }
    $worksheet1->write( $row, 0, $tmp );
    $row++;

    if ( defined $args{countryCode} ) {
        $tmp = $snapshotData->{xml}{Country};
    } else {
        $tmp = BookPub::Analytics::SnapshotUtils::allCountriesLabel();
    }
    $worksheet1->write( $row, 0, $tmp );
    $row += 2;

    # the "by service" rows...
    $col = 0;
    $tmp = BookPub::Analytics::SnapshotUtils::rankHeader();
    _write_worksheet( $worksheet1, $row, $col++, $tmp );

    if ($displayLastRank) {
        $tmp = BookPub::Analytics::SnapshotUtils::lastRankHeader();
        _write_worksheet( $worksheet1, $row, $col++, $tmp );
    }

    $tmp = BookPub::Analytics::SnapshotUtils::authorHeader();
    _write_worksheet( $worksheet1, $row, $col++, $tmp );

    $tmp = BookPub::Analytics::SnapshotUtils::unitsHeader();
    _write_worksheet( $worksheet1, $row, $col++, $tmp );

    $tmp = BookPub::Analytics::SnapshotUtils::revenueHeader();
    _write_worksheet( $worksheet1, $row, $col++, $tmp );

    my %bigHash;

    # First, get a hashref to the Table
    my $hashref = $snapshotData->{xml}{Tables};
    while ( my ( $key, $value ) = each(%$hashref) ) {
        my @tableArray = @$value;    #array of 1 element, Table
        foreach my $tableElement (@tableArray) {
            my %hash = %$tableElement;
            if ( $hash{TableName} eq "top_authors" ) {

                # write the header row
                my $arrayRef = $hash{HeaderRow};
                foreach my $hrow (@$arrayRef) {
                    my ( $key2, $value2 ) = %$hrow;
                    foreach my $cell (@$value2) {
                        if ( $cell->{Key} eq "Data" ) {
                            _write_worksheet( $worksheet1, $row, $col++, $cell->{Value} );
                        }            #if
                    }    #foreach
                }    #foreach
                $row++;

                # write the data rows
                $col = 0;
                my $dataArrayRef = $hash{DataRow};
                foreach my $drow (@$dataArrayRef) {
                    my ( $key3, $value3 ) = %$drow;
                    foreach my $cell (@$value3) {
                        if ( $cell->{Key} eq "Rank" ) {
                            $tmp = BookPub::Analytics::SnapshotUtils::stripper( $cell->{Value} );
                            _write_worksheet( $worksheet1, $row, $col++, $tmp, $formatNumber );
                        }    #if
                        elsif ( $cell->{Key} eq "PrevRank" && $displayLastRank ) {
                            if ( $cell->{Value} gt '' ) {
                                $tmp = BookPub::Analytics::SnapshotUtils::stripper( $cell->{Value} );
                            } else {
                                $tmp = "--";
                            }
                            _write_worksheet( $worksheet1, $row, $col++, $tmp, $formatNumber );
                        }    #elsif
                        elsif ( $cell->{Key} eq "AuthorInfo" ) {
                            _write_worksheet( $worksheet1, $row, $col++, $cell->{AuthorInfo}{AuthorName} );
                        }    #elsif
                        elsif ( $cell->{Key} eq "Units" ) {
                            $tmp = BookPub::Analytics::SnapshotUtils::stripper( $cell->{Value} );
                            _write_worksheet( $worksheet1, $row, $col++, $tmp, $formatNumber );
                        }    #elsif
                        elsif ( $cell->{Key} eq "Revenue" ) {
                            $tmp = BookPub::Analytics::SnapshotUtils::stripper( $cell->{Value} );
                            _write_worksheet( $worksheet1, $row, $col++, $tmp, $formatCurrency );
                        }    #elsif
                        elsif ( $cell->{Key} eq "Data" ) {
                            $tmp = BookPub::Analytics::SnapshotUtils::stripper( $cell->{Value} );
                            _write_worksheet( $worksheet1, $row, $col++, $tmp, $formatCurrency );
                        }    #elsif
                    }    #foreach
                    $row++;
                    $col = 0;
                }    #foreach
            }    #if
        }    #foreach
    }    #while
    $row += 3;

    $tmp = BookPub::Analytics::SnapshotUtils::disclaimer();
    $worksheet1->write( $row, 0, $tmp, $formatItalics );

    BookPub::Analytics::SnapshotUtils::autofit_columns($worksheet1);
    $workbook->close();

    return $str;
}

###############################################################################
#
#
sub _write_worksheet {

    my $worksheet = shift;
    my $row       = shift;
    my $col       = shift;
    my $string    = shift;
    my $format    = shift;

    BookPub::Analytics::SnapshotUtils::_store_string_widths( $worksheet, $col, $string );
    $worksheet->write( $row, $col, $string, $format );
}

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