#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package Raptor::Tracker::Command::SetRevenue;
use strict;
use warnings;
use URI::Escape;
use Data::Dumper;

use lib '/app/tools/common/lib';
use RSApache::Response::XSLT;
use Common::Assert;
use Common::Locale;
use Common::CurrencyFormat;
use Common::Client;

use lib '/app/tools/rps/lib';
use RPS::File::File;

use lib '/app/tools/raptor/lib';
use Raptor::Tracker::Command::Main;

use Raptor::Command;
use base 'Raptor::Tracker::Command::Base';

sub cmd  { return "revenue"; }
sub area { return "tracker"; }

use constant kTemplate => '/app/tools/raptor/templates/tracker.xsl';

sub execute {
    my ($self) = @_;

    # Give any inherited methods the first crack at this.
    # (This checks for login and basic access permissions).
    #
    my $response = $self->SUPER::execute();
    return $response if $response;

    my $fileID = $self->getParam('file');
    my $file = RPS::File::File->new( file_id => $fileID );
    assert($file);
    assert( $file->FileStatus != File::File::STATUS_CLOSED );
    $file->{SetRevenue} = 1;

    my $has_multiple_revenue = $self->getParam('has_mulitple_revenue');
    if ($has_multiple_revenue) {
        my @countries = split( " ", $has_multiple_revenue );
        my $count = 0;
        my $first_reset;

        my %currencies;

        foreach my $this_country (@countries) {
            $first_reset = 0;
            $first_reset = 1 if ( $count == 0 );
            my $revenueParam = $self->getParam( 'revenue_' . $this_country );
            $revenueParam = "0.00" if ( $revenueParam == 0 && defined( $self->getParam( 'revenue_' . $this_country ) ) == 1 );

            #$revenueParam =~ s/,//g;

            # We also need to update the currency conversion table (user_input_conversion_rate)
            # which stores the revenue by currency, rather than country.
            my $currencyFormat = Common::CurrencyFormat->new( countryCode => $this_country );
            my $currencyCode = $currencyFormat->currencyCode();
            $currencies{$currencyCode} += $revenueParam;

            if ( !$file->SetMultipleTerritoryRevenue( $revenueParam, $fileID, $this_country, $first_reset ) ) {
                $self->addMessageXML( type => 'error', code => 'invalid_revenue' );
            }
            $count++;
        }

        # Okay, now we've got a hash of currency codes and values.
        # Time to update the currency conversion table.
        foreach my $currencyCode ( keys %currencies ) {
            my $currencyValue = $currencies{$currencyCode};
            $file->UpdateCurrencyConversionRevenue( $fileID, $currencyCode, $currencyValue );
        }

        $file->UpdateSummary();
        my $redirect = $self->getParam('redirect') || '/app/tracker?page=' . $self->getParam('page');
        return RSApache::Response::Redirect->new($redirect);
    } else {
        # if 'skip_revenue' is set, this will prevent the revenue from being recorded in
        # the user_input_revenue table
        #
        my $skipRevenueFlag = $self->getParam('skip_revenue');

        # Are we setting this, or just displaying the current value?
        #
        my $revenueParam = $self->getParam('revenue');
        $revenueParam = "0.00" if ( $revenueParam == 0 && defined( $self->getParam('revenue') ) == 1 );
        if ($revenueParam) {

            #$revenueParam =~ s/,//g;
            if ( $file->SetRevenue( $revenueParam, $skipRevenueFlag ) ) {
                $file->UpdateCurrencyConversionRevenue( $fileID, $file->{currency_code}, $revenueParam );
                my $redirect = $self->getParam('redirect') || '/app/tracker?page=' . $self->getParam('page');
                return RSApache::Response::Redirect->new($redirect);
            } else {
                $self->addMessageXML( type => 'error', code => 'invalid_revenue' );
            }
        }
    }

    $self->{xml}{File} = $file->GetObjectXML();

    # Add the 'date range' value to the XML.
    #
    $self->{xml}{File}{DateSalesFilePeriod} = Common::Client::Current()->Locale()->formatDate( $file->SalesFileDateBegin ) . " - "
      . Common::Client::Current()->Locale()->formatDate( $file->SalesFileDateEnd );

    $response = RSApache::Response::XSLT->new( $self->{xml}, kTemplate );
    return $response;
}

1;
