#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# Copyright (C) 2011 RoyaltyShare, Inc.   All Rights Reserved
#---------------------------------------------------------------

package RPS::Report::Dynamic::Expense::Base;

use strict;
use warnings;

use lib '/app/tools/common/lib';
use lib '/app/tools/report/lib';
use lib '/app/tools/rps/lib';
use lib '/app/tools/appuser/lib';

use Common::Log;
use Common::Assert;
use File::Path;
use AppUser::DB::Item::AccessLevel;
use Text::CSV::Encoded;
use Report::Dynamic::Parameters;
use RPS::DB::Item::DynamicReport::Expense::Base;

#use RPS::DB::Item::DynamicReport::Expense::Base;

use base 'Report::Dynamic::SingleQuery';

#
#  ((((((((((  Public Interface
#

sub Group { 'Expenses' }

sub UserLevelIsValid {
    my ( $class, $userLevel ) = @_;
    my %validLevels = (
        AppUser::DB::Item::AccessLevel::kRSAdmin()          => 1,
        AppUser::DB::Item::AccessLevel::kRSAccountRep()     => 1,
        AppUser::DB::Item::AccessLevel::kRoyalty()          => 1,
        AppUser::DB::Item::AccessLevel::kAdminCatalogView() => 1,
        AppUser::DB::Item::AccessLevel::kAdmin()            => 1,
    );

    return $validLevels{$userLevel};
}

sub Type         { 'Artist & Producer' }
sub FilenameType { 'Expenses' }

# defined at the end of this file
#
sub _ParamClass { 'RPS::Report::Dynamic::Expense::Base::Parameters'; }

sub ClientTypeMask { return Common::Client::kArtist; }

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

    my $cols = [];

    push @$cols,
      {
        header => {
            name => 'contract-title',
        },
        column => {
            field => 'artist_contract_title',
        },
      },
      {
        header => {
            name => 'artist',
        },
        column => {
            field => 'artist_name',
        },
      },
      {
        header => {
            name => 'contract-id',
        },
        column => {
            field => 'client_contract_id',
        },
      },
      {
        header => {
            name => 'rs-contract-id',
        },
        column => {
            field => 'rs_contract_id',
        },
      },
      {
        header => {
            name => 'payor',
        },
        column => {
            field => 'payor',
        },
      },
      {
        header => {
            name => 'payee',
        },
        column => {
            field => 'payee',
        },
      },
      {
        header => {
            name => 'client-account-no',
        },
        column => {
            field => 'artist_client_account_id',
        },
      },
      {
        header => {
            name => 'rs-payee-id',
        },
        column => {
            field => 'artist_payee_id',
        },
      },
      {
        header => {
            name => 'date-issued',
        },
        column => {
            field  => 'date_issued',
            method => '_formatDate',
            excel  => 'date:Y-M-D',
        },
      },
      {
        header => {
            name => 'term-start',
        },
        column => {
            field => 'term_start',
            excel => 'date:Y-M-D',
        },
      },
      {
        header => {
            name => 'term-end',
        },
        column => {
            field => 'term_end',
            excel => 'date:Y-M-D',
        },
      },
      {
        header => {
            name => 'album-title',
        },
        column => {
            field => 'album_title',
        },
      },
      {
        header => {
            name => 'catalog-no',
        },
        column => {
            field => 'catalog_number',
        },
      },
      {
        header => {
            name => 'client-album-id',
        },
        column => {
            field => 'client_album_id',
        },
      },
      {
        header => {
            name => 'album-artist',
        },
        column => {
            field => 'album_artist',
        },
      },
      {
        header => {
            name => 'label-name',
        },
        column => {
            field => 'label_name',
        },
      },
      {
        header => {
            name => 'rs-album-id',
        },
        column => {
            field => 'rs_album_id',
        },
      },
      {
        header => {
            name => 'track-title',
        },
        column => {
            field => 'track_title',
        },
      },
      {
        header => {
            name => 'track-no',
        },
        column => {
            field => 'track_no',
        },
      },
      {
        header => {
            name => 'track-artist',
        },
        column => {
            field => 'track_artist',
        },
      },
      {
        header => {
            name => 'isrc',
        },
        column => {
            field => 'isrc',
        },
      },
      {
        header => {
            name => 'rs-track-id',
        },
        column => {
            field => 'rs_track_id',
        },
      },
      {
        header => {
            name => 'proration',
        },
        column => {
            field => 'prorate_track_count',
        },
      },
      {
        header => {
            name => 'contract-status',
        },
        column => {
            field  => 'contract_status',
            method => '_contractStatus',
        },
      },
      {
        header => {
            name => 'cross-collateralize',
        },
        column => {
            field => 'cross_collateralized',
        },
      },
      {
        header => {
            name => 'deduction-type',
        },
        column => {
            field => 'deduction_type',
        },
      },
      {
        header => {
            name => 'expense-type',
        },
        column => {
            field => 'expense_type_name',
        },
      },
      {
        header => {
            name => 'percent',
        },
        column => {
            field => 'percent',
        },
      },
      {
        header => {
            name   => 'amount',
            method => '_appendCurrencyCode',
        },
        column => {
            field => 'amount',
            excel => 'number:0.00',
        },
      },
      {
        header => {
            name   => 'effective-amount',
            method => '_appendCurrencyCode',
        },
        column => {
            field  => 'amount',
            method => '_effectiveAmount',
            excel  => 'number:0.00',
        },
      },
      {
        header => {
            name   => 'net-rate',
        },
        column => {
            field => 'net_rate',
            excel  => 'number:0.00',
        },
      },
      {
        header => {
            name => 'memo',
        },
        column => {
            field => 'memo',
        },
      },
      {
        header => {
            name => 'processed',
        },
        column => {
            field => 'processed',
        },
      },
      $self->_additionalRunStatementColumns(),
      {
        header => {
            name => 'expense-date-created',
        },
        column => {
            field => 'date_created',
            excel => 'date:Y-M-D',
        },
      },
      {
        header => {
            name => 'expense-created-by',
        },
        column => {
            field  => 'created_by',
            method => '_userIDToUserName',
        },
      },
      {
        header => {
            name => 'expense-date-modified',
        },
        column => {
            field => 'date_modified',
            excel => 'date:Y-M-D',
        },
      },
      {
        header => {
            name => 'expense-modified-by',
        },
        column => {
            field  => 'modified_by',
            method => '_userIDToUserName',
        },
      },
      {
        header => {
            name => 'rs-expense-id',
        },
        column => {
            field => 'expense_id',
        },
      },
      {
        header => {
            name => 'album-custom-1',
        },
        column => {
            field => 'album_custom_1',
        },
      },
      {
        header => {
            name => 'album-custom-2',
        },
        column => {
            field => 'album_custom_2',
        },
      },
      {
        header => {
            name => 'album-custom-3',
        },
        column => {
            field => 'album_custom_3',
        },
      },
      {
        header => {
            name => 'track-custom-1',
        },
        column => {
            field => 'track_custom_1',
        },
      },
      {
        header => {
            name => 'track-custom-2',
        },
        column => {
            field => 'track_custom_2',
        },
      },
      {
        header => {
            name => 'track-custom-3',
        },
        column => {
            field => 'track_custom_3',
        },
	};

    return $cols;
}

sub _additionalRunStatementColumns {
    my $self= shift;

    my @cols;
    my $reportType = $self->parameters()->{OptionalData}->ReportType();
    if ( $reportType && $reportType =~ /^(?:Processed|All)$/i ) {
        @cols = (
            {
              header => {
                  name => 'run-name',
              },
              column => {
                  field => 'artist_run_name',
              },
            },
            {
              header => {
                  name => 'rs-run-id',
              },
              column => {
                  field => 'artist_run_id',
              },
            },
            {
              header => {
                  name => 'rs-statement-id',
              },
              column => {
                  field => 'artist_statement_id',
              },
            }
        );
    }

    return @cols;
}

sub _getCollection {
    my $self = shift;

    my $param = $self->parameters()->{OptionalData}->ReportType();
    my $dateTypeParam;
    my $dateType = $self->parameters()->{Criteria}->DateType();
    if ( $dateType eq 'Date Created' ) {
        $dateTypeParam = 'date_created';
    } elsif ( $dateType eq 'Date Modified' ) {
        $dateTypeParam = 'date_modified';
    }

    return RPS::DB::Item::DynamicReport::Expense::Base->ReportQuery(
        reportType => $param,
        dateType   => $dateTypeParam,
        startDate  => $self->parameters()->{Criteria}->StartDate(),
        endDate    => $self->parameters()->{Criteria}->EndDate(),
    );
}

sub _secondsFromDuration {
    my ( $self, %args ) = @_;
    my $rowItem   = $args{row};
    my $fieldName = $args{field};

    my $totalSeconds = $rowItem->$fieldName();
    return '' unless $totalSeconds;
    return int( $totalSeconds % 60 );
}

sub _minutesFromDuration {
    my ( $self, %args ) = @_;
    my $rowItem   = $args{row};
    my $fieldName = $args{field};

    my $totalSeconds = $rowItem->$fieldName();
    return '' unless $totalSeconds;
    return int( $totalSeconds / 60 );
}

sub _effectiveAmount {
    my ( $self, %args ) = @_;
    my $rowItem   = $args{row};
    my $fieldName = $args{field};

    my $amount  = $rowItem->amount();
    my $percent = $rowItem->percent();

    return sprintf( "%0.02f", Common::RSMath::round( $amount * ( $percent / 100 ), 2 ) );
}

sub _contractStatus {
    my ( $self, %args ) = @_;
    my $rowItem   = $args{row};
    my $fieldName = $args{field};

    my $status = $rowItem->$fieldName();

    return 'active'   if 1 == $status;
    return 'inactive' if 2 == $status;
    return 'unknown';
}

1;

package RPS::Report::Dynamic::Expense::Base::Parameters;
use strict;
use warnings;

use lib '/app/tools/common/lib';
use lib '/app/tools/report/lib';
use lib '/app/tools/rps/lib';
use base 'RPS::Report::Dynamic::Parameters';

sub _Criteria {
    return {
        'StartDate' => {
            order   => 1,
            type    => Report::Dynamic::Parameters::kTypeDate,
            display => 'Start Date',
        },
        'EndDate' => {
            order   => 2,
            type    => Report::Dynamic::Parameters::kTypeDate,
            display => 'End Date',
        },
        'DateType' => {
            type        => Report::Dynamic::Parameters::kTypeMenu,
            display     => 'Only show data based on date parameters',
            validValues => [ 'None', 'Date Created', 'Date Modified' ],
            value       => 'None',
        },
    };
}

sub _OptionalData {
    {
        'ReportType' => {
            type          => Report::Dynamic::Parameters::kTypeRadioGroup,
            order         => 1,
            validValues   => [ 'Pending', 'Processed', 'All' ],
            displayValues => [ 'Show Pending Expenses', 'Show Processed Expenses', 'Show All' ],

            #            display => 'Options',
            value => 'Pending',                                 # This sets the _default_ value.
            filename => [ 'wPending', 'wProcessed', 'wAll' ],
        },
    };
}

1;
