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

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::FormatDetailReport;
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::FormatDetailReport->new(
        periodType     => $args{periodType},
        periodParam    => $args{periodParam},
        endPeriodParam => $args{endPeriodParam},
        imprintID      => $args{imprintID},
        publisherID    => $args{publisherID},
        formatType     => $args{formatType},
        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);

    # First worksheet, Top Services
    my $worksheet1 = $workbook->add_worksheet( BookPub::Analytics::SnapshotUtils::topServicesSheetName() );

    my $row = 0;
    $tmp = BookPub::Analytics::SnapshotUtils::topServicesFormatDetailTitle();
    $worksheet1->write( $row, 0, $tmp, $formatBold );
    $row += 2;

    $tmp = $snapshotData->{xml}{ProductInfo}{FormatName};
    $worksheet1->write( $row, 0, $tmp );
    $row++;

    $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;

    $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::topServicesHeader();
    _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 Services
    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 "top_services" ) {

                # 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 service, percent and Value from it
                    foreach my $itemHashRef (@legendArray) {
                        my %itemHash = %$itemHashRef;
                        $col = 0;
                        $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, Top Books
    my $worksheet2 = $workbook->add_worksheet( BookPub::Analytics::SnapshotUtils::topBooksSheetName() );

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

    $tmp = $snapshotData->{xml}{ProductInfo}{FormatName};
    $worksheet2->write( $row, 0, $tmp );
    $row++;

    $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::titleHeader();
    _write_worksheet( $worksheet2, $row, $col++, $tmp );
    $tmp = BookPub::Analytics::SnapshotUtils::authorHeader();
    _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 );
    $row++;

    # 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_books" ) {
                my $arrayRef = $hash{DataRow};
                foreach my $cell (@$arrayRef) {
                    my ( $key2, $value2 ) = %$cell;
                    my $col = 0;
                    foreach my $item (@$value2) {
                        if ( $item->{Key} eq "ProductInfo" ) {
                            $tmp = $item->{ProductInfo}{Title};
                            _write_worksheet( $worksheet2, $row, $col++, $tmp );
                            my $author = $item->{ProductInfo}{Authors}[0];
                            if ( $item->{ProductInfo}{Authors}[1] ) {
                                $author .= " (and others)";
                            }
                            $tmp = $author;
                            _write_worksheet( $worksheet2, $row, $col++, $tmp );
                        } elsif ( $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 "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 );
                        }    #ifelse
                    }    #foreach
                    $row++;
                }    #foreach
            }    #if
        }    #foreach
    }    #while

    $row += 3;

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

    # Third worksheet, Top Authors
    my $worksheet3 = $workbook->add_worksheet( BookPub::Analytics::SnapshotUtils::topAuthorsSheetName() );

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

    $tmp = $snapshotData->{xml}{ProductInfo}{FormatName};
    $worksheet3->write( $row, 0, $tmp );
    $row++;

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

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

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

    $col = 0;
    $tmp = BookPub::Analytics::SnapshotUtils::rankHeader();
    _write_worksheet( $worksheet3, $row, $col++, $tmp );

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

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

    # 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_authors" ) {
                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( $worksheet3, $row, $col++, $tmp, $formatNumber );
                        } elsif ( $item->{Key} eq "PrevRank" && $displayLastRank ) {
                            if ( length( $item->{Value} ) eq 0 ) {
                                $tmp = "--";
                            } else {
                                $tmp = $item->{Value};
                            }
                            _write_worksheet( $worksheet3, $row, $col++, $tmp, $formatNumber );
                        } elsif ( $item->{Key} eq "AuthorInfo" ) {
                            $tmp = $item->{AuthorInfo}{AuthorName};
                            _write_worksheet( $worksheet3, $row, $col++, $tmp );
                        } elsif ( $item->{Key} eq "Units" ) {
                            $tmp = BookPub::Analytics::SnapshotUtils::stripper( $item->{Value} );
                            _write_worksheet( $worksheet3, $row, $col++, $tmp, $formatNumber );
                        } elsif ( $item->{Key} eq "Revenue" ) {
                            $tmp = BookPub::Analytics::SnapshotUtils::stripper( $item->{Value} );
                            _write_worksheet( $worksheet3, $row, $col++, $tmp, $formatCurrency );
                        }    #ifelse
                    }    #foreach
                    $row++;
                }    #foreach
            }    #if
        }    #foreach
    }    #while

    $row += 3;

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

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

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