#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package RPS::App;

use strict;
use warnings;

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

use lib '/app/tools/rps/lib';
use RSApache::RSWebApp;
use base 'RSApache::RSWebApp';

my %gCommandMap = (

    # ---- User Commands ---- #
    'portal' => {
        'DEFAULT' => 'RPS::Portal::Command::Main',
        'main'    => 'RPS::Portal::Command::Main',
        'history' => 'RPS::Portal::Command::History',
        'label'   => 'RPS::Portal::Command::Label',
        'resend'  => 'RPS::Portal::Command::Resend',
        'email_custom_text'  => 'RPS::Portal::Command::EmailCustomText',
    },
    'help' => {
        'DEFAULT' => 'RPS::Help::Command::Show',
        'show'    => 'RPS::Help::Command::Show',
    },
    'forgotpw' => {
        'DEFAULT'  => 'AppUser::ForgotPW::Command::ForgotPW',
        'forgotpw' => 'AppUser::ForgotPW::Command::ForgotPW',
    },

    'login' => {
        'DEFAULT' => 'AppUser::Login::Command::Login',
        'login'   => 'AppUser::Login::Command::Login',
        'select'  => 'AppUser::Login::Command::Select',
        'changepw'   => 'AppUser::User::Command::ForceChangePW',
        'update' => 'AppUser::Login::Command::Login',
        'config' => 'AppUser::Login::Command::MFAConfig',
        'qrcode' => 'AppUser::Login::Command::MFAConfig',
        'sms'    => 'AppUser::Login::Command::MFAConfig',
        'help'   => 'AppUser::Login::Command::MFAConfig',
        'spn'    => 'AppUser::Login::Command::MFAStorePhoneNumber',
#        'scode'  => 'AppUser::Login::Command::MFASendEmailCode',
        'tcode'  => 'AppUser::Login::Command::MFASendTextCode',
        'auth'   => 'AppUser::Login::Command::MFAAuth',
        'success' => 'AppUser::Login::Command::MFAAuth',
        'authc'   => 'AppUser::Login::Command::MFAAuth',
    },

    'logout' => {
        'DEFAULT' => 'AppUser::Logout::Command::Logout',
        'logout'  => 'AppUser::Logout::Command::Logout',
    },

    'user' => {
        'DEFAULT'    => 'AppUser::User::Command::Search',
        'search'     => 'AppUser::User::Command::Search',
        'edit'       => 'AppUser::User::Command::Edit',
        'show'       => 'AppUser::User::Command::Show',
        'contact'    => 'AppUser::User::Command::Contact',
        'profile'    => 'AppUser::User::Command::Profile',
        'loginas'    => 'AppUser::User::Command::LoginAs',
        'changepw'   => 'AppUser::User::Command::ChangePW',
        'import'     => 'AppUser::User::Command::Import',
        'terms'      => 'AppUser::User::Command::Terms',
        'view_terms' => 'AppUser::User::Command::ViewTerms',
        'resetmfa'   => 'AppUser::User::Command::ResetMFA',
    },

    # ---- RPS Commands ---- #
    'artist_contract' => {
        'DEFAULT'                => 'RPS::ArtistContract::Command::Main',
        'main'                   => 'RPS::ArtistContract::Command::Main',
        'list'                   => 'RPS::ArtistContract::Command::List',
        'show'                   => 'RPS::ArtistContract::Command::Show',
        'edit'                   => 'RPS::ArtistContract::Command::Edit',
        'delete'                 => 'RPS::ArtistContract::Command::Delete',
        'search'                 => 'RPS::ArtistContract::Command::Search',
        'search_artist_contract' => 'RPS::ArtistContract::Command::SearchArtistContract',
        'search_license_income'  => 'RPS::ArtistContract::Command::SearchLicenseIncome',
        'term'                   => 'RPS::ArtistContract::Command::TermEdit',
        'delete_term'            => 'RPS::ArtistContract::Command::TermDelete',
        'deduction'              => 'RPS::ArtistContract::Command::DeductionEdit',
        'unit_escalation'        => 'RPS::ArtistContract::Command::UnitEscalationEdit',
        'region'                 => 'RPS::ArtistContract::Command::RegionEdit',
        'expense'                => 'RPS::ArtistContract::Command::ExpenseTypeEdit',
        'license_income'         => 'RPS::ArtistContract::Command::ArtistContractLicenseIncomeEdit',
    },

    'artist_payee' => {
        'DEFAULT' => 'RPS::Payee::Command::Main',
        'main'    => 'RPS::Payee::Command::Main',
        'list'    => 'RPS::ArtistPayee::Command::List',
        'search'  => 'RPS::ArtistPayee::Command::Search',
        'show'    => 'RPS::ArtistPayee::Command::Show',
        'edit'    => 'RPS::ArtistPayee::Command::Edit',
        'delete'  => 'RPS::ArtistPayee::Command::Delete',
        'account' => 'RPS::ArtistPayee::Command::AccountEdit',
    },

    'artist_statement_settings' => {
        'DEFAULT' => 'RPS::Statement::Settings::Command::ShowArtistSettings',
        'show'    => 'RPS::Statement::Settings::Command::ShowArtistSettings',
        'edit'    => 'RPS::Statement::Settings::Command::EditArtistSettings',
    },

    'artist_royalty' => {
        'DEFAULT'    => 'RPS::ArtistRoyalty::Command::List',
        'list'       => 'RPS::ArtistRoyalty::Command::List',
        'show'       => 'RPS::ArtistRoyalty::Command::Show',
        'payors'     => 'RPS::ArtistRoyalty::Command::ListPayors',
        'editpay'    => 'RPS::ArtistRoyalty::Command::EditPayments',
        'distribute' => 'RPS::ArtistRoyalty::Command::DistributeStatements',
        'create'     => 'RPS::ArtistRoyalty::Command::Create',
        'commit'     => 'RPS::ArtistRoyalty::Command::Commit',
        'delete'     => 'RPS::ArtistRoyalty::Command::Delete',
        'invalidate' => 'RPS::ArtistRoyalty::Command::Invalidate',
        'pdf'        => 'RPS::ArtistRoyalty::Command::DownloadPDF',
        'cp_text'    => 'RPS::ArtistRoyalty::Command::DownloadCurrentPeriodText',
        'cp_excel'   => 'RPS::ArtistRoyalty::Command::DownloadCurrentPeriodExcel',
        'ab_text'    => 'RPS::ArtistRoyalty::Command::DownloadAlbumBalancesText',
        'ab_excel'   => 'RPS::ArtistRoyalty::Command::DownloadAlbumBalancesExcel',
        'manual'     => 'RPS::ArtistRoyalty::Command::DownloadManualStatements',
        'license_income_payable_audit_excel' => 'RPS::ArtistRoyalty::Command::DownloadLicenseIncomePayableAuditExcel',
        'royalty_breakdown'                  => 'RPS::ArtistRoyalty::Command::RoyaltyBreakdown',
        'royalty_breakdown_dl'               => 'RPS::ArtistRoyalty::Command::DownloadRoyaltyBreakdown',
    },

    'ca_license' => {
        'DEFAULT'         => 'RPS::License::Command::CA::Edit',
        'preedit'         => 'RPS::License::Command::CA::PreEdit',
        'edit'            => 'RPS::License::Command::CA::Edit',
        'delete'          => 'RPS::License::Command::CA::Delete',
        'show'            => 'RPS::License::Command::CA::Show',
        'copy'            => 'RPS::License::Command::CA::Copy',
        'account'         => 'RPS::License::Command::CA::AccountEdit',
        'crossed_account' => 'RPS::License::Command::CA::CrossedAccountEdit',
    },

    'ca_publisher' => {
        'DEFAULT'                => 'RPS::Publisher::Command::CA::List',
        'list'                   => 'RPS::Publisher::Command::CA::List',
        'list_licenses'          => 'RPS::Publisher::Command::CA::ListLicenses',
        'list_direct_licenses'   => 'RPS::Publisher::Command::CA::ListDirectLicenses',
        'list_indirect_licenses' => 'RPS::Publisher::Command::CA::ListIndirectLicenses',
        'search'                 => 'RPS::Publisher::Command::CA::Search',
        'show'                   => 'RPS::Publisher::Command::CA::Show',
        'edit'                   => 'RPS::Publisher::Command::CA::Edit',
        'delete'                 => 'RPS::Publisher::Command::CA::Delete',
        'account'                => 'RPS::Publisher::Command::CA::AccountEdit',
        'edit_direct'            => 'RPS::Publisher::Command::CA::EditDirect',
        'edit_indirect'          => 'RPS::Publisher::Command::CA::EditIndirect',
    },

    'catalog' => {
        'DEFAULT'                   => 'RPS::Catalog::Command::Main',
        'main'                      => 'RPS::Catalog::Command::Main',
        'list'                      => 'RPS::Catalog::Command::List',
        'search'                    => 'RPS::Catalog::Command::Search',
        'search_product'            => 'RPS::Catalog::Command::SearchProduct',
        'search_track'              => 'RPS::Catalog::Command::SearchTrack',
        'search_track_ajax'         => 'RPS::Catalog::Command::SearchTrackAjax',
        'show'                      => 'RPS::Catalog::Command::Show',
        'edit'                      => 'RPS::Catalog::Command::Edit',
        'da_show'                   => 'RPS::Catalog::Command::DAShow',
        'da_edit'                   => 'RPS::Catalog::Command::DAEdit',
        'attach'                    => 'RPS::Catalog::Command::Attach',
        'detach'                    => 'RPS::Catalog::Command::Detach',
        'delete'                    => 'RPS::Catalog::Command::Delete',
        'dist_cache'                => 'RPS::Catalog::Command::DistributionCache',
        'dist_cache_status'         => 'RPS::Catalog::Command::DistributionCacheStatus',
        'advance'                   => 'RPS::Catalog::Command::AdvanceEdit',
        'cc'                        => 'RPS::Catalog::Command::ToggleAdvanceCC',
        'error_report'              => 'RPS::Catalog::Command::ErrorReport',
        'expense'                   => 'RPS::Catalog::Command::ExpenseView',
        'expense_edit'              => 'RPS::Catalog::Command::ExpenseEdit',
        'expense_delete'            => 'RPS::Catalog::Command::ExpenseDelete',
        'make_cc'                   => 'RPS::Catalog::Command::SetAsControlledComp',
        'make_ca_cc'                => 'RPS::Catalog::Command::SetAsCAControlledComp',
        'show_main'                 => 'RPS::Catalog::Command::ShowMain',
        'show_licenses'             => 'RPS::Catalog::Command::ShowLicenses',
        'show_ca_licenses'          => 'RPS::Catalog::Command::ShowCALicenses',
        'show_uk_licenses'          => 'RPS::Catalog::Command::ShowUkLicenses',
        'show_contracts'            => 'RPS::Catalog::Command::ShowContracts',
        'show_digital'              => 'RPS::Catalog::Command::ShowDigital',
        'search_duplicates'         => 'RPS::Catalog::Command::SearchDuplicates',
        'search_album'              => 'RPS::Catalog::Command::SearchAlbum',
        'search_artist'             => 'RPS::Catalog::Command::SearchArtist',
        'search_composer'           => 'RPS::Catalog::Command::SearchComposer',
        'search_import'             => 'RPS::Catalog::Command::SearchImport',
        'search_no_image'           => 'RPS::Catalog::Command::SearchImage',
        'search_no_audio'           => 'RPS::Catalog::Command::SearchAudio',
        'search_no_metadata'        => 'RPS::Catalog::Command::SearchMetadata',
        'search_dr'                 => 'RPS::Catalog::Command::SearchDistributionReady',
        'search_no_dr'              => 'RPS::Catalog::Command::SearchDistributionReady',
        'search_in_queue'           => 'RPS::Catalog::Command::SearchDistributionStatus',
        'search_delivered'          => 'RPS::Catalog::Command::SearchDistributionStatus',
        'image_upload'              => 'RPS::Catalog::Command::ImageUpload',
        'inactivate_album_contract' => 'RPS::Catalog::Command::InactivateAlbumContract',
        'reactivate_album_contract' => 'RPS::Catalog::Command::ReactivateAlbumContract',
    },

    'ccomp' => {
        'DEFAULT' => 'RPS::ControlledComposition::Command::Edit',
        'edit'    => 'RPS::ControlledComposition::Command::Edit',
        'show'    => 'RPS::ControlledComposition::Command::Show',
    },

    'contract' => {
        'DEFAULT' => 'RPS::Contract::Command::Main',
        'main'    => 'RPS::Contract::Command::Main',
        'list'    => 'RPS::Contract::Command::List',
        'search'  => 'RPS::Contract::Command::Search',
    },

    'dashboard' => {
        'DEFAULT'      => 'RPS::Dashboard::Command::Show',
        'show'         => 'RPS::Dashboard::Command::Show',
        'delete_alert' => 'RPS::Dashboard::Command::DeleteAlert',
        'save_alert'   => 'RPS::Dashboard::Command::SaveAlert',
    },

    'display' => {
        'DEFAULT' => 'RPS::Display::Command::Show',
        'show'    => 'RPS::Display::Command::Show',
    },

    'distribution' => {
        'DEFAULT'           => 'RPS::Distribution::Command::Show',
        'show'              => 'RPS::Distribution::Command::Show',
        'upload'            => 'RPS::Distribution::Command::Show',
        'save'              => 'RPS::Distribution::Command::Show',
        'discard'           => 'RPS::Distribution::Command::Show',
        'fail'              => 'RPS::Distribution::Command::Show',
        'albumdetail'       => 'RPS::Distribution::Command::AlbumDetail',
        'exceldump'         => 'RPS::Distribution::Command::ExcelDump',
        'errorreport'       => 'RPS::Distribution::Command::ErrorReport',
        'override'          => 'RPS::Distribution::Command::Override',
        'duplicate'         => 'RPS::Distribution::Command::DuplicateSearch',
        'metadata_spec_pdf' => 'RPS::Distribution::Command::DownloadMetadataSpecPDF',
        'metadata_template' => 'RPS::Distribution::Command::DownloadMetadataTemplate',
        'duplicate'         => 'RPS::Distribution::Command::DuplicateSearch',
        'upload_file'       => 'RPS::Distribution::Command::UploadFile',
        'upload_status'     => 'RPS::Distribution::Command::UploadStatus',
    },

    'distributor' => {
        'DEFAULT' => 'RPS::Distributor::Command::Search',
        'search'  => 'RPS::Distributor::Command::Search',
    },

    'label' => {
        'DEFAULT'     => 'RPS::Label::Command::List',
        'list'        => 'RPS::Label::Command::List',
        'edit'        => 'RPS::Label::Command::Edit',
        'show'        => 'RPS::Label::Command::Show',
        'set_default' => 'RPS::Label::Command::MakeDefault',
    },

    'label_contract' => {
        'DEFAULT'            => 'RPS::LabelContract::Command::Main',
        'main'               => 'RPS::LabelContract::Command::Main',
        'list'               => 'RPS::LabelContract::Command::List',
        'show'               => 'RPS::LabelContract::Command::Show',
        'edit'               => 'RPS::LabelContract::Command::Edit',
        'search'             => 'RPS::LabelContract::Command::Search',
        'edit_contract_ajax' => 'RPS::LabelContract::Command::EditContractAjax',
        'show_contract_ajax' => 'RPS::LabelContract::Command::ShowContractAjax',
        'edit_term_ajax'     => 'RPS::LabelContract::Command::EditTermAjax',
        'show_term_ajax'     => 'RPS::LabelContract::Command::ShowTermAjax',
        'delete_term_ajax'   => 'RPS::LabelContract::Command::DeleteTermAjax',
    },

    'label_payee' => {
        'DEFAULT' => 'RPS::LabelPayee::Command::Main',
        'main'    => 'RPS::LabelPayee::Command::Main',
        'list'    => 'RPS::LabelPayee::Command::List',
        'search'  => 'RPS::LabelPayee::Command::Search',
        'show'    => 'RPS::LabelPayee::Command::Show',
        'edit'    => 'RPS::LabelPayee::Command::Edit',
        'account' => 'RPS::LabelPayee::Command::AccountEdit',
    },

    'label_royalty' => {
        'DEFAULT'    => 'RPS::LabelRoyalty::Command::List',
        'list'       => 'RPS::LabelRoyalty::Command::List',
        'show'       => 'RPS::LabelRoyalty::Command::Show',
        'editpay'    => 'RPS::LabelRoyalty::Command::EditPayments',
        'create'     => 'RPS::LabelRoyalty::Command::Create',
        'commit'     => 'RPS::LabelRoyalty::Command::Commit',
        'delete'     => 'RPS::LabelRoyalty::Command::Delete',
        'invalidate' => 'RPS::LabelRoyalty::Command::Invalidate',
        'pdf'        => 'RPS::LabelRoyalty::Command::DownloadPDF',
    },

    'license' => {
        'DEFAULT'         => 'RPS::License::Command::US::Edit',
        'preedit'         => 'RPS::License::Command::US::PreEdit',
        'edit'            => 'RPS::License::Command::US::Edit',
        'delete'          => 'RPS::License::Command::US::Delete',
        'show'            => 'RPS::License::Command::US::Show',
        'copy'            => 'RPS::License::Command::US::Copy',
        'account'         => 'RPS::License::Command::US::AccountEdit',
        'crossed_account' => 'RPS::License::Command::US::CrossedAccountEdit',
    },

    'log' => {
        'DEFAULT' => 'RPS::Log::Command::Begin',
        'b'       => 'RPS::Log::Command::Begin',
        'e'       => 'RPS::Log::Command::End',
    },

    'main' => {
        'DEFAULT'  => 'RPS::Main::Command::Redirect',
        'redirect' => 'RPS::Main::Command::Redirect',
    },

    'mapface' => {
        'DEFAULT'         => 'RPS::MapFace::Command::Main',
        'main'            => 'RPS::MapFace::Command::Main',
        'map'             => 'RPS::MapFace::Command::Map',
        'undo'            => 'RPS::MapFace::Command::Undo',
        'approve'         => 'RPS::MapFace::Command::Approve',
        'more_sales_ajax' => 'RPS::MapFace::Command::MoreSalesAjax',
    },

    'master' => {
        'DEFAULT'    => 'RPS::Master::Command::List',
        'list'       => 'RPS::Master::Command::List',
        'show'       => 'RPS::Master::Command::Show',
        'edit'       => 'RPS::Master::Command::Edit',
        'search'     => 'RPS::Master::Command::Search',
        'search_xml' => 'RPS::Master::Command::SearchXML',
    },

    'ca_mechanical' => {
        'DEFAULT'      => 'RPS::Mechanical::CA::Command::List',
        'list'         => 'RPS::Mechanical::CA::Command::List',
        'show'         => 'RPS::Mechanical::CA::Command::Show',
        'payors'       => 'RPS::Mechanical::CA::Command::ListPayors',
        'editpay'      => 'RPS::Mechanical::CA::Command::EditPayments',
        'create'       => 'RPS::Mechanical::CA::Command::Create',
        'commit'       => 'RPS::Mechanical::CA::Command::Commit',
        'delete'       => 'RPS::Mechanical::CA::Command::Delete',
        'pdf'          => 'RPS::Mechanical::CA::Command::DownloadPDF',
        'excel'        => 'RPS::Mechanical::CA::Command::DownloadExcel',
        'text'         => 'RPS::Mechanical::CA::Command::DownloadText',
        'cmrra'        => 'RPS::Mechanical::CA::Command::DownloadCMRRA',
        'label_pdf'    => 'RPS::Mechanical::CA::Command::DownloadLabelPDF',
        'invalidate'   => 'RPS::Mechanical::CA::Command::Invalidate',
        'export_text'  => 'RPS::Mechanical::CA::Command::DownloadExportText',
        'export_excel' => 'RPS::Mechanical::CA::Command::DownloadExportExcel',
    },

    'mechanical' => {
        'DEFAULT'      => 'RPS::Mechanical::US::Command::List',
        'list'         => 'RPS::Mechanical::US::Command::List',
        'show'         => 'RPS::Mechanical::US::Command::Show',
        'payors'       => 'RPS::Mechanical::US::Command::ListPayors',
        'editpay'      => 'RPS::Mechanical::US::Command::EditPayments',
        'distribute'   => 'RPS::Mechanical::US::Command::DistributeStatements',
        'create'       => 'RPS::Mechanical::US::Command::Create',
        'commit'       => 'RPS::Mechanical::US::Command::Commit',
        'delete'       => 'RPS::Mechanical::US::Command::Delete',
        'pdf'          => 'RPS::Mechanical::US::Command::DownloadPDF',
        'label_pdf'    => 'RPS::Mechanical::US::Command::DownloadLabelPDF',
        'excel'        => 'RPS::Mechanical::US::Command::DownloadExcel',
        'text'         => 'RPS::Mechanical::US::Command::DownloadText',
        'invalidate'   => 'RPS::Mechanical::US::Command::Invalidate',
        'export_text'  => 'RPS::Mechanical::US::Command::DownloadExportText',
        'export_excel' => 'RPS::Mechanical::US::Command::DownloadExportExcel',
        'manual'       => 'RPS::Mechanical::US::Command::DownloadManualStatements',
    },

    'new_contract' => {
        'show'   => 'RPS::ArtistContract::Command::Show',
        'edit'   => 'RPS::ArtistContract::Command::Edit',
        'search' => 'RPS::ArtistContract::Command::Search',
    },

    'payee' => {
        'DEFAULT' => 'RPS::Payee::Command::Main',
        'main'    => 'RPS::Payee::Command::Main',
        'list'    => 'RPS::Payee::Command::List',
        'search'  => 'RPS::Payee::Command::Search',
    },

    'payor' => {
        'DEFAULT'     => 'RPS::Payor::Command::Search',
        'search'      => 'RPS::Payor::Command::Search',
        'show'        => 'RPS::Payor::Command::Show',
        'edit'        => 'RPS::Payor::Command::Edit',
        'delete'      => 'RPS::Payor::Command::Delete',
        'set_default' => 'RPS::Payor::Command::MakeDefault',
    },

    'price' => {
        'DEFAULT' => 'RPS::Price::Command::List',
        'list'    => 'RPS::Price::Command::List',
        'edit'    => 'RPS::Price::Command::Edit',
        'delete'  => 'RPS::Price::Command::Delete',
    },

    'product' => {
        'DEFAULT'             => 'RPS::Product::Command::Show',
        'delete'              => 'RPS::Product::Command::Delete',
        'show'                => 'RPS::Product::Command::Show',
        'edit'                => 'RPS::Product::Command::Edit',
        'edit_digital'        => 'RPS::Product::Command::EditDigital',
        'edit_service'        => 'RPS::Product::Command::EditService',
        'show_digital'        => 'RPS::Product::Command::ShowDigital',
        'toggle_distribution' => 'RPS::Product::Command::ToggleDistribution',
        'toggle_price_tier'   => 'RPS::Product::Command::TogglePriceTier',
    },

    'publisher' => {
        'DEFAULT'                => 'RPS::Publisher::Command::US::List',
        'list'                   => 'RPS::Publisher::Command::US::List',
        'list_licenses'          => 'RPS::Publisher::Command::US::ListLicenses',
        'list_direct_licenses'   => 'RPS::Publisher::Command::US::ListDirectLicenses',
        'list_indirect_licenses' => 'RPS::Publisher::Command::US::ListIndirectLicenses',
        'search'                 => 'RPS::Publisher::Command::US::Search',
        'show'                   => 'RPS::Publisher::Command::US::Show',
        'edit'                   => 'RPS::Publisher::Command::US::Edit',
        'delete'                 => 'RPS::Publisher::Command::US::Delete',
        'account'                => 'RPS::Publisher::Command::US::AccountEdit',
        'edit_direct'            => 'RPS::Publisher::Command::US::EditDirect',
        'edit_indirect'          => 'RPS::Publisher::Command::US::EditIndirect',
    },

    'reference' => {
        'statrates' => 'RPS::Reference::Command::StatRateTable',
        'DEFAULT'   => 'RPS::Reference::Command::StatRateTable',
    },

    'region' => {
        'DEFAULT'          => 'RPS::Region::Command::List',
        'list'             => 'RPS::Region::Command::List',
        'edit'             => 'RPS::Region::Command::Edit',
        'show'             => 'RPS::Region::Command::Show',
        'delete'           => 'RPS::Region::Command::Delete',
        'search'           => 'RPS::Region::Command::Search',
        'search_all'       => 'RPS::Region::Command::SearchAll',
        'set_default_mech' => 'RPS::Region::Command::MakeDefaultMechanicalLicenseRegion',
    },

    'report' => {
        'DEFAULT'  => 'RPS::Report::Dynamic::Command::List',
        'list'     => 'RPS::Report::Dynamic::Command::List',
        'show'     => 'RPS::Report::Dynamic::Command::Show',
        'cancel'   => 'RPS::Report::Dynamic::Command::Cancel',
        'delete'   => 'RPS::Report::Dynamic::Command::Delete',
        'download' => 'RPS::Report::Dynamic::Command::Download',

        'tracks_no_timings'              => 'RPS::Report::Command::TracksWithoutSongTimings',
        'license_overage'                => 'RPS::Report::Command::LicenseOverage',
        'tracks_no_licenses'             => 'RPS::Report::Command::TracksWithoutLicenses',
        'inactive_licenses'              => 'RPS::Report::Command::InactiveLicenses',
        'albums_no_contracts'            => 'RPS::Report::Command::AlbumsWithoutContracts',
        'products_no_prices'             => 'RPS::Report::Command::ProductsWithoutPrices',
        'missed_sales'                   => 'RPS::Report::Command::MissedSales',
        'payee_mailing'                  => 'RPS::Report::Command::ArtistPayeeMailing',
        'publisher_mailing'              => 'RPS::Report::Command::PublisherMailing',
        'license_accrual'                => 'RPS::Report::Command::MissingLicenseAccrual',
        'artist_reserve_pipeline'        => 'RPS::Report::Command::ArtistReservePipeline',
        'uk_mech_unit_summary'           => 'RPS::Report::Command::UKMechUnitSummary',
        'uk_mech_negative_units'         => 'RPS::Report::Command::UKMechNegativeUnits',
        'uk_mech_current_retentions'     => 'RPS::Report::Command::UKMechCurrentRetentions',
        'uk_mech_retention_summary'      => 'RPS::Report::Command::UKMechRetentionSummary',
        'uk_mech_retention_run_summary'  => 'RPS::Report::Command::UKMechRetentionRunSummary',
        'uk_mech_missed_sales'           => 'RPS::Report::Command::UKMechMissedSales',
        'ca_tracks_no_timings'           => 'RPS::Report::Command::CATracksWithoutSongTimings',
        'ca_license_overage'             => 'RPS::Report::Command::CALicenseOverage',
        'ca_tracks_no_licenses'          => 'RPS::Report::Command::CATracksWithoutLicenses',
        'ca_inactive_licenses'           => 'RPS::Report::Command::CAInactiveLicenses',
        'ca_publisher_mailing'           => 'RPS::Report::Command::CAPublisherMailing',
        'ca_license_accrual'             => 'RPS::Report::Command::CAMissingLicenseAccrual',
        'mechanical_reserve_pipeline'    => 'RPS::Report::Command::MechanicalReservePipeline',
        'ca_mechanical_reserve_pipeline' => 'RPS::Report::Command::CAMechanicalReservePipeline',
        'labels_no_contracts'            => 'RPS::Report::Command::LabelsWithoutContracts',
        'labels_multiple_contracts'      => 'RPS::Report::Command::LabelsWithMultipleContracts',

    },

    'service' => {
        'DEFAULT' => 'RPS::Service::Command::Edit',
        'edit'    => 'RPS::Service::Command::Edit',
        'search'  => 'RPS::Service::Command::Search',
    },

    'song' => {
        'DEFAULT'    => 'RPS::Song::Command::List',
        'list'       => 'RPS::Song::Command::List',
        'show'       => 'RPS::Song::Command::Show',
        'edit'       => 'RPS::Song::Command::Edit',
        'search'     => 'RPS::Song::Command::Search',
        'search_xml' => 'RPS::Song::Command::SearchXML',
    },

    'statement' => {
        'DEFAULT'                => 'RPS::Statement::Command::Main',
        'main'                   => 'RPS::Statement::Command::Main',
        'show_mechanical'        => 'RPS::Statement::Command::ShowMechanical',
        'show_mechanical_pdf'    => 'RPS::Statement::Command::ShowMechanicalPDF',
        'show_ca_mechanical_pdf' => 'RPS::Statement::Command::ShowCAMechanicalPDF',
        'show_ca_mechanical'     => 'RPS::Statement::Command::ShowCAMechanical',
        'show_uk_mechanical'     => 'RPS::Statement::Command::ShowUKMechanical',
        'show_artist'            => 'RPS::Statement::Command::ShowArtist',
        'show_artist_pdf'        => 'RPS::Statement::Command::ShowArtistPDF',
        'show_label'             => 'RPS::Statement::Command::ShowLabel',
        'show_label_pdf'         => 'RPS::Statement::Command::ShowLabelPDF',
        'excel_artist'           => 'RPS::Statement::Command::DownloadArtistExcel',
        'pdf_artist'             => 'RPS::Statement::Command::DownloadArtistPDF',
        'pdf_label'              => 'RPS::Statement::Command::DownloadLabelPDF',
        'pdf_mechanical'         => 'RPS::Statement::Command::DownloadMechanicalPDF',
        'pdf_ca_mechanical'      => 'RPS::Statement::Command::DownloadCAMechanicalPDF',
        'pdf_mcps'               => 'RPS::Statement::Command::DownloadMcpsPDF',
        'text_mechanical'        => 'RPS::Statement::Command::DownloadMechanicalText',
        'text_ca_mechanical'     => 'RPS::Statement::Command::DownloadCAMechanicalText',
        'cmrra_ca_mechanical'    => 'RPS::Statement::Command::DownloadCAMechanicalCMRRA',
        'text_mcps'              => 'RPS::Statement::Command::DownloadMcpsText',
        'report_label'           => 'RPS::Statement::Command::DownloadLabelReport',
        'artist_pdf'             => 'RPS::Statement::Command::ArtistPDF',
        'label_pdf'              => 'RPS::Statement::Command::LabelPDF',
        'us_mechanical_pdf'      => 'RPS::Statement::Command::USMechanicalPDF',
        'ca_mechanical_pdf'      => 'RPS::Statement::Command::CAMechanicalPDF',
        'cmrra_statement_excel'  => 'RPS::Statement::Command::DownloadCAMechanicalCMRRAExcel',
        'cmrra_summary_excel'    => 'RPS::Statement::Command::DownloadCAMechanicalCMRRASummaryExcel',
    },

    'term' => {
        'DEFAULT' => 'RPS::Term::Command::Edit',
        'edit'    => 'RPS::Term::Command::Edit',
        'show'    => 'RPS::Term::Command::Show',
    },

    'track' => {
        'DEFAULT'                   => 'RPS::Track::Command::Edit',
        'edit'                      => 'RPS::Track::Command::Edit',
        'show'                      => 'RPS::Track::Command::Show',
        'delete'                    => 'RPS::Track::Command::Delete',
        'presubmit'                 => 'RPS::Track::Command::PreSubmit',
        'mech'                      => 'RPS::Track::Command::MechanicalExempt',
        'ca_mech'                   => 'RPS::Track::Command::CAMechanicalExempt',
        'attach'                    => 'RPS::Track::Command::Attach',
        'detach'                    => 'RPS::Track::Command::Detach',
        'advance'                   => 'RPS::Track::Command::AdvanceEdit',
        'cc'                        => 'RPS::Track::Command::ToggleAdvanceCC',
        'prtc'                      => 'RPS::Track::Command::SetProrateTrackCount',
        'expense'                   => 'RPS::Track::Command::ExpenseView',
        'expense_edit'              => 'RPS::Track::Command::ExpenseEdit',
        'expense_delete'            => 'RPS::Track::Command::ExpenseDelete',
        'up'                        => 'RPS::Track::Command::MoveUp',
        'down'                      => 'RPS::Track::Command::MoveDown',
        'inactivate_track_contract' => 'RPS::Track::Command::InactivateTrackContract',
        'reactivate_track_contract' => 'RPS::Track::Command::ReactivateTrackContract',
    },

    'uk_mech' => {
        'DEFAULT'    => 'RPS::Mechanical::UK::Command::List',
        'list'       => 'RPS::Mechanical::UK::Command::List',
        'show'       => 'RPS::Mechanical::UK::Command::Show',
        'create'     => 'RPS::Mechanical::UK::Command::Create',
        'commit'     => 'RPS::Mechanical::UK::Command::Commit',
        'delete'     => 'RPS::Mechanical::UK::Command::Delete',
        'invalidate' => 'RPS::Mechanical::UK::Command::Invalidate',
        'pdf'        => 'RPS::Mechanical::UK::Command::DownloadPDF',
        'excel'      => 'RPS::Mechanical::UK::Command::DownloadExcel',
        'text'       => 'RPS::Mechanical::UK::Command::DownloadText',

        'edit_mcps_license' => 'RPS::Mechanical::UK::Command::EditMcpsLicense',
        'show_mcps_license' => 'RPS::Mechanical::UK::Command::ShowMcpsLicense',
    },

    'workbench' => {
        'DEFAULT' => 'RPS::Workbench::Command::Show',
        'show'    => 'RPS::Workbench::Command::Show',
    },

    'locale' => {
        'validate_number' => 'RPS::Locale::Command::ValidateNumber',
        'format_number'   => 'RPS::Locale::Command::FormatNumber',
        'format_money'    => 'RPS::Locale::Command::FormatMoney',
    },

    'test' => {
        'DEFAULT' => 'RPS::Test::Command::Test',
    },
);

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

    return \%gCommandMap;
}

1;
