#------------------------------------------------------------
# Copyright (C) 2010 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package BookPub::Catalog::Chart::Base;

use strict;
use warnings;
use Data::Dumper;

use File::Temp;
use File::Basename;
use Data::Dumper;
use POSIX;
use Date::Calc;

use Date::Manip;

use lib '/app/tools/common/lib';
use Common::Assert;
use Common::Client;

use lib '/usr/local/chart_director/lib';
use perlchartdir;

use Common::FormObject;
use base 'Common::FormObject';

use constant kChartFileExt    => ".png";
use constant kChartFilePrefix => "bp_catalog";
use constant kChartFileDir    => "/app/data/charts/catalog";
use constant kChartImgDir     => "/images/charts/catalog";
use constant kNoDataColor     => 0xe2e2e2;
use constant kTextColor       => 0x303B1F;
use constant kLabelGap        => 4;

my %serviceColorMap = (
    8  => 0x1da923,    #amazon
    9  => 0xf13357,    #apple
    16 => 0xf79646,    #barnes and noble
    49 => 0xffff00,    #borders
    52 => 0x15b6f9,    #google
    4  => 0x9900ff,    #sony
);

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

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

    $self->{_days}      = $args{days};
    $self->{_offset}    = $args{offset};
    $self->{_serviceID} = $args{serviceID};
    $self->{_productID} = $args{productID};
    $self->{_chartType} = $args{chartType};
    $self->{_bookID}    = $args{bookID};
    $self->{_dateStart} = $args{dateStart};
    $self->{_dateEnd}   = $args{dateEnd};

    # We'll need to limit how many labels we display.
    my $labelStep = 1;

    my $days = $self->{_days};

    my $maxLabels = $self->_getMaxLabels();

    if ( $days > $maxLabels ) {
        $labelStep = ceil( $days / $maxLabels );
    }

    $self->{_labelStep} = $labelStep;

    # Now to factor in the offest/
    if ( $self->{_offset} ) {
        $self->{_days} += $self->{_offset};
    } else {
        $self->{_offset} = 0;
    }

    # We need to reduce this by one, since the date range is inclusive.
    #
    $self->{_days}--;

    # We need to convert number of days into a date range.
    #
    if ( !$self->{_dateStart} ) {
        $self->{_dateStart} = UnixDate( "$self->{_days} days ago",   "%Y-%m-%d\n" );
        $self->{_dateEnd}   = UnixDate( "$self->{_offset} days ago", "%Y-%m-%d\n" );
    }

    $self->_generateChartImage();
    Common::Log::Debug("Chart File: $self->{ChartSource}");

    return $self;
}

sub _getChartFilename {
    my $self = shift;

    mkdir(kChartFileDir) unless ( -d kChartFileDir );

    my $tmp = new File::Temp(
        UNLINK   => 0,
        DIR      => kChartFileDir,
        SUFFIX   => kChartFileExt,
        TEMPLATE => kChartFilePrefix . '_XXXXXXXXXXX'
    );

    die "Failed to create temp file: $tmp: $!" unless ( -e "$tmp" );

    Common::Log::Debug("Temp file: $tmp");
    return "$tmp";

}

sub _getServiceColor {
    my $self      = shift;
    my $serviceID = shift;

    return $serviceColorMap{$serviceID};
}

sub _getServiceColorMap {
    return %serviceColorMap;
}

sub HasRankings {
    my $self      = shift;
    my $serviceID = shift;

    if ( $serviceID == 8 || $serviceID == 16 ) {
        return 1;
    }
    return undef;
}

sub HasPOS {
    my $self      = shift;
    my $serviceID = shift;

    if ( $serviceID == 8 || $serviceID == 9 || $serviceID == 16 ) {
        return 1;
    }
    return undef;
}

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

    my $imageMap = $args{imageMap};
    my $type     = $args{type};

    #Common::Log::Debug( $imageMap );

    if ( $type && $type eq 'number' ) {
        $imageMap =~ s/%%([\+\-0-9\.]+)%%/_formatMapNumber($1)/gem;
    } else {
        $imageMap =~ s/%%([\+\-0-9\.]+)%%/_formatMapRevenue($1)/gem;
    }

    $self->{ImageMap} = $imageMap;
}

sub _formatMapRevenue {
    my $value = shift;

    my $rawValue = $value;

    $value = Common::Client::Current()->Locale()->formatMoney( Common::RSMath::round( $value, 2 ) );

    if ( $rawValue < 0 ) {

        # We want to add a space between the negative sign and the number.
        $value =~ s/-//;
        $value = "- $value";
    }

    return $value;
}

sub _formatMapNumber {
    my $value = shift;

    my $rawValue = $value;

    $value = Common::Client::Current()->Locale()->formatNumber( Common::RSMath::round( $value, 2 ) );

    if ( $rawValue < 0 ) {

        # We want to add a space between the negative sign and the number.
        $value =~ s/-//;
        $value = "- $value";
    }

    return $value;
}

sub _generateChartImage {
    my ($self) = @_;
    assert( 0, 'override' );
}

sub _getChartData {
    my ($self) = @_;
    assert( 0, 'override' );
}

sub _getMaxLabels {
    return 7;
}

###
1;    #
###
