#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# 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 => '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 => 'album-artist',
        },
        column => {
            field => 'album_artist',
        },
    },
    {
        header => {
            name => 'label-name',
        },
        column => {
            field => 'label_name',
        },
    },
    {
        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 => 'track-minutes',
        },
        column => {
            field => 'duration',
            method => '_minutesFromDuration',
        },
    },
    {
        header => {
            name => 'track-seconds',
        },
        column => {
            field => 'duration',
            method => '_secondsFromDuration',
        },
    },
    {
        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 => 'memo',
        },
        column => {
            field => 'memo',
        },
    },
    {
        header => {
            name => 'processed',
        },
        column => {
            field => 'processed',
        },
    },
    {
        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',
        },
    };

    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',
        },
        'EndDate' =>
        {
            order => 2,
            type => Report::Dynamic::Parameters::kTypeDate,
            display => 'End',
        },
        '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;
