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

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

use lib '/app/tools/bookpub/lib';
use BookPub::Tracker::File;
use BookPub::Tracker::File::Display;
use BookPub::Tracker::Command::Main;

use base 'BookPub::Command';

sub cmd      { return "currency"; }
sub area     { return "tracker"; }
sub pageName { return "File Conversion Rate"; }

use constant kTemplate => '/app/tools/bookpub/templates/tracker/conversion_rate.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 $submit            = $self->getParam('submit')          || 0;
    my $fileID            = $self->getParam('file')            || 0;
    my $page              = $self->getParam('page')            || 1;
    my $redirect          = $self->getParam('redirect')        || '';
    my $fileCurrencies    = $self->getParam('file_currencies') || '';

    my $oFile = BookPub::Tracker::File::Display->new( fileID => $fileID );
    assert($oFile);
    assert( $oFile->FileStatus != BookPub::DB::Item::File::STATUS_CLOSED );

    my @fileCurrencies = split( ',', $fileCurrencies );

    # apply changes
    if ( $submit ) {
        $oFile->updateSummary(altCurrency => 1);
        $oFile->save();

        # Process base conversion rate if all entries are specified
        my $caughtError = 0;
        my $unassignedEntries = grep { !$_ } map { $self->getParam( 'currencyUnit' . $_ ) } @fileCurrencies;
        if ( $unassignedEntries == 0 ) {
            foreach my $currencyCode ( @fileCurrencies ) {
                my $rate = $self->getParam( 'currencyUnit' . $currencyCode );
                $rate = Common::Client::Current()->Locale->scrubNumber($rate);
                $caughtError++ unless $oFile->setConversionRate( $rate, $currencyCode );
            }
        }

        # Process alternate conversion rate if any entry is specified
        my $caughtErrorAlt = 0;
        $oFile->deleteAlternateConversionRateByFileID($oFile->FileID);
        foreach my $currencyCode ( @fileCurrencies ) {
            my $altCurrencyCode = $self->getParam( 'altCurrencyCode' . $currencyCode ) || '';
            my $altCurrencyUnit = $self->getParam( 'altCurrencyUnit' . $currencyCode ) || 0;
            my $rate = Common::Client::Current()->Locale->scrubNumber($altCurrencyUnit);
            next if ( !$rate || !$altCurrencyUnit || !$altCurrencyCode );
            $caughtErrorAlt++ unless $oFile->setAlternateConversionRate( $rate, $altCurrencyCode, 1, $currencyCode);
        }

        if ( !$caughtError && !$caughtErrorAlt ) {
            my $command = BookPub::Tracker::Command::Main->new( page => $page );
            my $url = $redirect || $command->getRedirect() . "#file$fileID";
            return RSApache::Response::Redirect->new($url);
        }

        $self->addMessageXML( type => 'error', code => 'invalid_currency' );
    }


    # return data to the page
    $oFile->{ConversionInput} = 1;

    # Base currency conversion data
    my $currencyList = $oFile->getCurrencyList();
    if ( $oFile->{CurrencyCode} eq 'MUL' ) {
        $oFile->{CurrencyList}{Currency} = $currencyList;
        $oFile->{CurrencyList}{All} = join( ',', map { $_->{CurrencyCode} } @$currencyList );
    } else {
        $oFile->{Currency} = $currencyList->[0];
    }

    # Alternate currency conversion data
    my $alternateCurrencyList = $oFile->getAlternateCurrencyList();
    $oFile->{AlternateCurrencyList}{Currency} = $alternateCurrencyList;

    my ( $minDate, $maxDate ) = $oFile->getDateRange();
    $oFile->{DateSalesFilePeriod} = join( ' - ',
        Common::Client::Current()->Locale()->formatDate($minDate),
        Common::Client::Current()->Locale()->formatDate($maxDate)
    );

    $self->{xml}{File} = $oFile;

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


1;