#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# Copyright (C) 2010 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#---------------------------------------------------------------
package BookPub::Sale::Report::Royalty::Factory;
use strict;
use warnings;

# This package provides a 'Factory' interface for the Royalty Report.
# It will return the 'correct' class, based on client id.

use lib '/app/tools/common/lib';
use lib '/app/tools/bookpub/lib';
use lib '/app/tools/data_classes/lib';
use Client::Client;
use Common::RSApp;
use Common::Assert;
use BookPub::Sale::Report::Royalty::BerrettKoehler;
use BookPub::Sale::Report::Royalty::Hachette;
use BookPub::Sale::Report::Royalty::HachetteUK;
use BookPub::Sale::Report::Royalty::Disney;
use BookPub::Sale::Report::Royalty::Hyperion;
use BookPub::Sale::Report::Royalty::Wiley;
use BookPub::Sale::Report::Royalty::Macmillan;
use BookPub::Sale::Report::Royalty::MacmillanAU;
use BookPub::Sale::Report::Royalty::MacmillanUK;
use BookPub::Sale::Report::Royalty::RSStandard;
use BookPub::Sale::Report::Royalty::RowmanLittlefield;
use BookPub::Sale::Report::Royalty::SagePub;
use BookPub::Sale::Report::Royalty::BloomsburyUK;

my %gPackages = (
    Client::Client::kBerrettKoehler()    => 'BookPub::Sale::Report::Royalty::BerrettKoehler',
    Client::Client::kHachette()          => 'BookPub::Sale::Report::Royalty::Hachette',
    Client::Client::kHachetteUK()        => 'BookPub::Sale::Report::Royalty::HachetteUK',
    Client::Client::kDisneyBooks()       => 'BookPub::Sale::Report::Royalty::Disney',
    Client::Client::kHyperion()          => 'BookPub::Sale::Report::Royalty::Hyperion',
    Client::Client::kWiley()             => 'BookPub::Sale::Report::Royalty::Wiley',
    Client::Client::kMacmillan()         => 'BookPub::Sale::Report::Royalty::Macmillan',
    Client::Client::kMacmillanAU()       => 'BookPub::Sale::Report::Royalty::MacmillanAU',
    Client::Client::kMacmillanAUPrint()  => 'BookPub::Sale::Report::Royalty::MacmillanAU',
    Client::Client::kMacmillanUK()       => 'BookPub::Sale::Report::Royalty::MacmillanUK',
    Client::Client::kRowmanLittlefield() => 'BookPub::Sale::Report::Royalty::RowmanLittlefield',
    Client::Client::kSagePub()           => 'BookPub::Sale::Report::Royalty::SagePub',
    Client::Client::kBloomsburyUK()      => 'BookPub::Sale::Report::Royalty::BloomsburyUK',
);

sub GetRoyaltyReport {
    my ($periodID) = @_;
    assert( defined $periodID, 'MISSING periodID parameter' );

    # Do we have a custom report format for this client?
    #
    my $report;
    my $clientID = Common::RSApp::GetClientID();
    my $pkg      = $gPackages{$clientID};
    $pkg = 'BookPub::Sale::Report::Royalty::RSStandard' unless $pkg;

    $report = $pkg->new( periodID => $periodID );

    return $report;
}

1;
