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

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::ImprintsSummaryReport;
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::ImprintsSummaryReport->new(
        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::imprintsSummarySheetName() );

    # First worksheet, Imprints Summary
    my $row = 0;
    $tmp = BookPub::Analytics::SnapshotUtils::imprintsSummaryTitle();
    $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;

    # Totals
    $col = 0;
    $tmp = BookPub::Analytics::SnapshotUtils::totalRevenueLabel();
    _write_worksheet( $worksheet1, $row, $col++, $tmp );
    $tmp = BookPub::Analytics::SnapshotUtils::stripper( $snapshotData->{xml}{Totals}{Revenue} );
    _write_worksheet( $worksheet1, $row, $col++, $tmp, $formatCurrency );
    $row++;

    $col = 0;
    $tmp = BookPub::Analytics::SnapshotUtils::totalUnitsLabel();
    _write_worksheet( $worksheet1, $row, $col++, $tmp );
    $tmp = BookPub::Analytics::SnapshotUtils::stripper( $snapshotData->{xml}{Totals}{Units} );
    _write_worksheet( $worksheet1, $row, $col++, $tmp, $formatNumber );
    $row += 2;

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

    # First, get a hashref to the Imprints
    my $hashref = $snapshotData->{xml}{Pies};
    while ( my ( $key, $value ) = each(%$hashref) ) {

        # there's only one value in the hash and it's an array (of hashes)
        my @pieArray = @$value;

        # walk the array until we find the one
        foreach my $pieHashRef (@pieArray) {
            if ( $pieHashRef->{PieName} eq "imprint_revenue" ) {

                # get a hashref to the Legend
                my $legendRef = $pieHashRef->{Legend};
                while ( my ( $key2, $value2 ) = each(%$legendRef) ) {

                    # get the array of hashes in it
                    my @legendArray = @$value2;

                    # walk the array getting country, percent and Value from it
                    foreach my $itemHashRef (@legendArray) {
                        $col = 0;
                        my %itemHash = %$itemHashRef;
                        $tmp = $itemHash{Label};
                        _write_worksheet( $worksheet1, $row, $col++, $tmp );
                        $tmp = BookPub::Analytics::SnapshotUtils::stripper( $itemHash{Percent} );
                        _write_worksheet( $worksheet1, $row, $col++, $tmp, $formatPercent );
                        $tmp = BookPub::Analytics::SnapshotUtils::stripper( $itemHash{Value} );
                        _write_worksheet( $worksheet1, $row, $col++, $tmp, $formatCurrency );
                        $row++;
                    }    #foreach
                }    #while
            }    #if
        }    #foreach
    }    #while

    $row += 3;

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

    # Second worksheet, Imprints
    my $worksheet2 = $workbook->add_worksheet( BookPub::Analytics::SnapshotUtils::imprintsSheetName() );

    $row = 0;
    $tmp = BookPub::Analytics::SnapshotUtils::imprintsTitle();
    $worksheet2->write( $row, 0, $tmp, $formatBold );
    $row += 2;

    $tmp = $self->BookPub::Analytics::SnapshotUtils::dateRangeFormat(%args);
    $worksheet2->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();
    }
    $worksheet2->write( $row, 0, $tmp );
    $row++;

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

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

    $col = 0;
    $tmp = BookPub::Analytics::SnapshotUtils::rankHeader();
    _write_worksheet( $worksheet2, $row, $col++, $tmp );
    
    if ($displayLastRank) {
        $tmp = BookPub::Analytics::SnapshotUtils::lastRankHeader();
        _write_worksheet( $worksheet2, $row, $col++, $tmp );
    }
    
    $tmp = BookPub::Analytics::SnapshotUtils::imprintsHeader();
    _write_worksheet( $worksheet2, $row, $col++, $tmp );
    $tmp = BookPub::Analytics::SnapshotUtils::unitsHeader();
    _write_worksheet( $worksheet2, $row, $col++, $tmp );
    $tmp = BookPub::Analytics::SnapshotUtils::revenueHeader();
    _write_worksheet( $worksheet2, $row, $col++, $tmp );

    # First, get a hashref to the Tables
    $hashref = $snapshotData->{xml}{Tables};
    while ( my ( $key, $value ) = each(%$hashref) ) {

        # there's several values in the hash and they're an array (of hashes)
        my @tableArray = @$value;

        # walk the array until we find the one
        foreach my $tableHashRef (@tableArray) {
            my %hash = %$tableHashRef;
            if ( $hash{TableName} eq "top_imprints" ) {
                my $headerArrayRef = $hash{HeaderRow};
                foreach my $cell (@$headerArrayRef) {
                    my ( $key2, $value2 ) = %$cell;
                    foreach my $item (@$value2) {
                        if ( $item->{Key} eq "Data" ) {
                            $tmp = $item->{Value};
                            _write_worksheet( $worksheet2, $row, $col++, $tmp );
                        }    #ifelse
                    }    #foreach
                }    #foreach
                $row++;
                my $arrayRef = $hash{DataRow};
                foreach my $cell (@$arrayRef) {
                    my ( $key2, $value2 ) = %$cell;
                    my $col = 0;
                    foreach my $item (@$value2) {
                        if ( $item->{Key} eq "Rank" ) {
                            $tmp = $item->{Value};
                            _write_worksheet( $worksheet2, $row, $col++, $tmp, $formatNumber );
                        } elsif ( $item->{Key} eq "PrevRank" && $displayLastRank ) {
                            if ( length( $item->{Value} ) eq 0 ) {
                                $tmp = "--";
                            } else {
                                $tmp = $item->{Value};
                            }
                            _write_worksheet( $worksheet2, $row, $col++, $tmp, $formatNumber );
                        } elsif ( $item->{Key} eq "ProductInfo" ) {
                            $tmp = $item->{ProductInfo}{ImprintName};
                            _write_worksheet( $worksheet2, $row, $col++, $tmp );
                        } elsif ( $item->{Key} eq "Units" ) {
                            $tmp = BookPub::Analytics::SnapshotUtils::stripper( $item->{Value} );
                            _write_worksheet( $worksheet2, $row, $col++, $tmp, $formatNumber );
                        } elsif ( $item->{Key} eq "Revenue" ) {
                            $tmp = BookPub::Analytics::SnapshotUtils::stripper( $item->{Value} );
                            _write_worksheet( $worksheet2, $row, $col++, $tmp, $formatCurrency );
                        } elsif ( $item->{Key} eq "Data" ) {
                            $tmp = BookPub::Analytics::SnapshotUtils::stripper( $item->{Value} );
                            _write_worksheet( $worksheet2, $row, $col++, $tmp, $formatCurrency );
                        }    #ifelse
                    }    #foreach
                    $row++;
                }    #foreach
            }    #if
        }    #foreach
    }    #while

    $row += 3;

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

    BookPub::Analytics::SnapshotUtils::autofit_columns($worksheet1);
    BookPub::Analytics::SnapshotUtils::autofit_columns($worksheet2);

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