#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package BookPub::Analytics::ChapterDetailReport;
use strict;
use warnings;

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

use lib '/app/tools/data_classes/lib';
use Period::QuarterPeriod;
use Period::MonthPeriod;
use Period::YearPeriod;

use lib '/app/tools/bookpub/lib';
use BookPub::Analytics::ReportLib;    # for pie charts
use BookPub::Stats::Sales;
use BookPub::Analytics::BaseReport;
use base 'BookPub::Analytics::BaseReport';

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

    $self->SUPER::_init(%args);

    my $stats_obj = $self->{_stats};
    return $self unless ($stats_obj);

    my $product_id = $args{productID};
    $self->{ProductInfo} = $self->_getChapterInfo( product_id => $product_id );

    my $total_metric = $stats_obj->GetTotalMetric( %{ $self->{_statParams} } );
    $self->{Totals}->{Revenue} = Common::Client::Current()->Locale->formatMoney( $total_metric->Revenue );
    $self->{Totals}->{Units}   = Common::Client::Current()->Locale->formatNumber( $total_metric->Units );

    my $chapters     = $stats_obj->GetTopRanking( category => 'product', rank_only => 1 );
    my $chaptersPrev = $stats_obj->GetTopRanking( category => 'product', prev_rank => 1 );
    $self->{Totals}{Rank}     = $chapters->{$product_id}     || 0;
    $self->{Totals}{PrevRank} = $chaptersPrev->{$product_id} || 0;

    my $pie_count      = 0;
    my $base_image_url = "";
    my $pie_data       = {};
    my @pies           = ();
    my $table_data     = [];
    my @tables         = ();

    # --------------------------
    # top services - build the pie and table data at the same time
    # --------------------------
    my $top_services = $stats_obj->GetTopRanking( category => 'service' );
    my $service_names = $self->_getServiceMap();

    my $service_rank = $stats_obj->GetDetailRanking( category => 'service' );
    my $service_rank_prev = $stats_obj->GetDetailRanking( category => 'service', prev_rank => 1 );

    foreach my $service_ref (@$top_services) {
        next if ( $service_ref->Revenue <= 0 );

        push @{ $pie_data->{labels} }, $service_names->{ $service_ref->ID };
        push @{ $pie_data->{ids} },    $service_ref->ID;
        push @{ $pie_data->{data} },   $service_ref->Revenue;

        my $row_data = {
            Units    => Common::Client::Current()->Locale()->formatNumber( $service_ref->Units ),
            Revenue  => Common::Client::Current()->Locale()->formatMoney( $service_ref->Revenue ),
            Rank     => $service_rank->{ $service_ref->ID },
            PrevRank => $service_rank_prev->{ $service_ref->ID },
        };

        $row_data->{ProductInfo}->{ServiceName} = $service_names->{ $service_ref->ID };
        $row_data->{ProductInfo}->{ServiceID}   = $service_ref->ID;

        push @$table_data, $row_data;
    }

    if ( $pie_data && defined $pie_data->{data} ) {
        my $image_link = $args{commandObj}->getParamsAsString( c => 1, service => 1 );
        $image_link .= '&' if ( length $image_link );
        $image_link .= 'c=s&service=';

        my $pie_href = GetPieChart(
            labels         => $pie_data->{labels},
            data           => $pie_data->{data},
            image_map_link => $image_link,
            label_ids      => $pie_data->{ids},
        );
        my $xml_href = {};
        $xml_href->{PieName}        = "top_services";
        $xml_href->{ImageSrc}       = $pie_href->{image_src};
        $xml_href->{ImageMap}       = $pie_href->{image_map};
        $xml_href->{Legend}->{Item} = $pie_href->{legend_xml};

        push @pies, $xml_href;

        # we have to keep track of the image we created
        # and how many we've created
        $base_image_url = $pie_href->{image_src};
        $pie_count++;
    }

    if ( $table_data && ( scalar @$table_data >= 1 ) ) {
        my $table_href = CreateTableXML( data => $table_data, order => [ 'ProductInfo', 'Rank', 'PrevRank', 'Units', 'Revenue' ] );

        if ($table_href) {
            $table_href->{TableName} = "chapter_revenue_by_service";
            push @tables, $table_href;
        }
    }

    # --------------------------
    # top formats - build the pie and table data at the same time
    # --------------------------
    my $top_formats = $stats_obj->GetTopRanking( category => 'format' );
    my $format_names = $stats_obj->FormatMap();

    my $format_rank = $stats_obj->GetDetailRanking( category => 'format' );
    my $format_rank_prev = $stats_obj->GetDetailRanking( category => 'format', prev_rank => 1 );

    $pie_data   = {};
    $table_data = [];

    foreach my $format_ref (@$top_formats) {
        next if ( $format_ref->Revenue <= 0 );

        push @{ $pie_data->{labels} }, $format_names->{ $format_ref->ID };
        push @{ $pie_data->{ids} },    $format_ref->ID;
        push @{ $pie_data->{data} },   $format_ref->Revenue;

        my $row_data = {
            Revenue  => Common::Client::Current()->Locale()->formatMoney( $format_ref->Revenue ),
            Units    => Common::Client::Current()->Locale()->formatNumber( $format_ref->Units ),
            Rank     => $format_rank->{ $format_ref->ID },
            PrevRank => $format_rank_prev->{ $format_ref->ID },
        };

        $row_data->{ProductInfo}->{FormatName} = $format_names->{ $format_ref->ID };
        $row_data->{ProductInfo}->{FormatType} = $format_ref->ID;

        push @$table_data, $row_data;
    }

    if ( $pie_data && defined $pie_data->{data} ) {
        my $image_link = $args{commandObj}->getParamsAsString( c => 1 );
        $image_link .= '&' if ( length $image_link );
        $image_link .= 'c=f&format=';

        my $pie_href = GetPieChart(
            labels         => $pie_data->{labels},
            data           => $pie_data->{data},
            image_map_link => $image_link,
            label_ids      => $pie_data->{ids},
            image_src      => $base_image_url,
            chart_num      => $pie_count,
        );
        my $xml_href = {};
        $xml_href->{PieName}        = "top_formats";
        $xml_href->{ImageSrc}       = $pie_href->{image_src};
        $xml_href->{ImageMap}       = $pie_href->{image_map};
        $xml_href->{Legend}->{Item} = $pie_href->{legend_xml};

        push @pies, $xml_href;

        # we have to keep track of dynamic images
        $base_image_url = $pie_href->{image_src};
        $pie_count++;
    }

    if ( $table_data && ( scalar @$table_data >= 1 ) ) {
        my $table_href = CreateTableXML( data => $table_data, order => [ 'ProductInfo', 'Rank', 'PrevRank', 'Units', 'Revenue' ] );

        if ($table_href) {
            $table_href->{TableName} = "chapter_revenue_by_format";
            push @tables, $table_href;
        }
    }

    $self->{Pies}->{Pie}     = \@pies;
    $self->{Tables}->{Table} = \@tables;

    return $self;
}

# Overridden from base report class
#
sub _initStatsParams {
    my ( $self, %args ) = @_;

    # This hash of parameters gets re-used several times.
    # !!! Why, I don't really understand.  That needs to be fixed.
    #
    my %params = (
        period_id    => $self->{_period}->PeriodID,
        period_type  => $self->{_period}->PeriodType,
        end_period_id => $args{endPeriodParam},
        client_id    => Common::RSApp::GetClientID(),
        imprint_id   => $args{imprintID},
        product_id   => $args{productID},
        country_code => $args{countryCode},
        product_type => PROD_CHAP,
    );

    return \%params;
}

1;
