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

# The US and CA licenses look the same (same columns) - But they do have
# different data sources.  So we'll put the common stuff in here.
# Note that UK licenses are totally different.

package RPS::Report::Dynamic::Licenses::USCABase;

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 Report::Dynamic::Parameters;
use RPS::DB::Item::ProductType;
use RPS::DB::Item::TrackLicense;
use RPS::DB::Item::ReserveLiquidation;

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

#
# Really just want to move some of the formatting methods into a common place.
# I thought about creating a base RPS::Report::Dynamic class, but I don't want
# to _assume_ that every sort of report will inherit from SingleQuery.
#
# But anything that requires 'RPS' data should NOT be moved into the Report namespace.
#


sub Group   { 'Licenses'; }

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 ReserveType
{
    my ($class) = @_;
    assert(0, 'override to return the reserve type id)');
}



# defined at the end of this file
#
sub _ParamClass { 'RPS::Report::Dynamic::Catalog::Licenses::USCABaseParameters'; }



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

    my @columns;
    push @columns, (
        { 
            header => { 
                name => 'album-title', 
            }, 
            column => { 
                field => 'album_title', 
            } 
        },
        { 
            header => { 
                name => 'album-title-version', 
            }, 
            column => { 
                field => 'album_title_version', 
            } 
        },
        { 
            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-number', 
            },       
            column => { 
                field => 'track_order', 
            } 
        },
        { 
            header => { 
                name => 'track-artist', 
            },       
            column => { 
                field => 'track_artist', 
            } 
        },
        { 
            header => { 
                name => 'track-minutes', 
            },       
            column => { 
                field => 'duration', 
                method => '_minutesFromDuration',
            } 
        },
        { 
            header => { 
                name => 'track-seconds', 
            },       
            column => { 
                field => 'duration', 
                method => '_secondsFromDuration',
            } 
        },
        { 
            header => { 
                name => 'isrc', 
            },       
            column => { 
                field => 'isrc',
            } 
        },
        { 
            header => { 
                name => 'license-type' 
            },             
            column => { 
                field => 'type',
                method => '_licenseTypeToString',
            } 
        },
        { 
            header => { 
                name => 'product-type', 
            },   
            column => { 
                field => 'product_type_description', 
#                method => '_productTypeIDToString', 
            } 
        },
        { 
            header => { 
                name => 'region', 
            },  
            column => { 
                field => 'region', 
            } 
        },
        { 
            header => { 
                name => 'share', 
            },    
            column => { 
                field => 'share', 
            } 
        },
        { 
            header => { 
                name => 'payor', 
            },  
            column => { 
                field => 'payor', 
            } 
        },
        { 
            header => { 
                name => 'publisher', 
            },           
            column => { 
                field => 'publisher_name', 
            } 
        },
        { 
            header => { 
                name => 'rs-publisher-id', 
            },           
            column => { 
                field => 'publisher_id', 
            } 
        },
        { 
            header => { 
                name => 'client-account-no', 
            },           
            column => { 
                field => 'publisher_client_account_id', 
            } 
        },
        { 
            header => { 
                name => 'admin', 
            },           
            column => { 
                field => 'admin_id', 
                method => '_idToPublisherName',
            } 
        },
        { 
            header => { 
                name => 'agent', 
            },           
            column => { 
                field => 'agent_id', 
                method => '_idToPublisherName',
            } 
        },
        { 
            header => { 
                name => 'publisher-direct', 
            },         
            column => { 
                field => 'publisher_direct', 
            } 
        },
    );

    $self->_issuerColumns(\@columns);

    push @columns, (
        { 
            header => { 
                name => 'crossed', 
            },         
            column => { 
                field => 'crossed', 
            } 
        },
        { 
            header => { 
                name => 'status', 
            },     
            column => { 
                field => 'status', 
            } 
        },
        { 
            header => { 
                name => 'mechanical-exempt', 
            },     
            column => { 
                field => 'mechanical_exempt', 
            } 
        },
        { 
            header => { 
                name => 'date-sent', 
            },       
            column => { 
                field => 'date_sent', 
                method => '_formatDate',
                excel => 'date:Y-M-D',
            } 
        },
        { 
            header => { 
                name => 'date-received', 
            },    
            column => { 
                field => 'date_received', 
                method => '_formatDate',
                excel => 'date:Y-M-D',
            } 
        },
        { 
            header => { 
                name => 'date-issued', 
            },    
            column => { 
                field => 'date_issued', 
                method => '_formatDate',
                excel => 'date:Y-M-D',
            } 
        },
        { 
            header => { 
                name => 'term-start', 
            },    
            column => { 
                field => 'term_start', 
                method => '_formatDate',
                excel => 'date:Y-M-D',
            } 
        },
        { 
            header => { 
                name => 'term-end', 
            },    
            column => { 
                field => 'term_end', 
                method => '_formatDate',
                excel => 'date:Y-M-D',
            } 
        },
        { 
            header => { 
                name => 'contract-title', 
            },    
            column => { 
                field => 'contract_title', 
            } 
        },
        { 
            header => { 
                name => 'track-cap', 
            },    
            column => { 
                field => 'track_cap', 
            } 
        },
        { 
            header => { 
                name => 'rate-type', 
            },    
            column => { 
                field => 'rate_type', 
                method => '_rateTypeToString',
            } 
        },
        { 
            header => { 
                name => 'rate-percent', 
            },    
            column => { 
                field => 'rate_percent', 
            } 
        },
        { 
            header => { 
                name => 'rate-basis', 
            },    
            column => { 
                field => 'rate_basis', 
                method => '_rateBasisToString',
            } 
        },
        { 
            header => { 
                name => 'lock-date', 
            },    
            column => { 
                field => 'lock_date', 
                method => '_formatDate',
                excel => 'date:Y-M-D',
            } 
        },
        { 
            header => { 
                name => 'penny-rate', 
            },    
            column => { 
                field => 'penny_rate', 
            } 
        },
        { 
            header => { 
                name => 'reserve-percent', 
            },    
            column => { 
                field => 'reserve_percent', 
            } 
        },
        { 
            header => { 
                name => 'digital-reserves', 
            },    
            column => { 
                field => 'digital_reserves', 
            } 
        },
        { 
            header => { 
                name => 'reserve-period-1', 
            },    
            column => { 
#                field => 'ls_1', 
                field => 'rs_id',
                method => '_ls1',
            } 
        },
        { 
            header => { 
                name => 'reserve-period-2', 
            },    
            column => { 
#                field => 'ls_2', 
                field => 'rs_id',
                method => '_ls2',
            } 
        },
        { 
            header => { 
                name => 'reserve-period-3', 
            },    
            column => { 
#                field => 'ls_3', 
                field => 'rs_id',
                method => '_ls3',
            } 
        },
        { 
            header => { 
                name => 'reserve-period-4', 
            },    
            column => { 
                #field => 'ls_4', 
                field => 'rs_id',
                method => '_ls4',
            } 
        },
        { 
            header => { 
                name => 'reserve-period-5', 
            },    
            column => { 
#                field => 'ls_5', 
                field => 'rs_id',
                method => '_ls5',
            } 
        },
        { 
            header => { 
                name => 'reserve-period-6', 
            },    
            column => { 
#                field => 'ls_6', 
                field => 'rs_id',
                method => '_ls6',
            } 
        },
        { 
            header => { 
                name => 'reserve-period-7', 
            },    
            column => { 
#                field => 'ls_7', 
                field => 'rs_id',
                method => '_ls7',
            } 
        },
        { 
            header => { 
                name => 'reserve-period-8', 
            },    
            column => { 
#                field => 'ls_8', 
                field => 'rs_id',
                method => '_ls8',
            } 
        },
        { 
            header => { 
                name => 'percent-of-sales', 
            },    
            column => { 
                field => 'percent_of_sales', 
            } 
        },
        { 
            header => { 
                name => 'free-goods', 
            },    
            column => { 
                field => 'free_goods', 
            } 
        },
        { 
            header => { 
                name => 'misc-deduction', 
            },    
            column => { 
                field => 'misc_deduction', 
            } 
        },
        { 
            header => { 
                name => 'comments', 
            },    
            column => { 
                field => 'comments', 
            } 
        },
        { 
            header => { 
                name => 'license-date-created', 
            },    
            column => { 
                field => 'date_created', 
                method => '_formatDate',
                excel => 'date:Y-M-D',
            } 
        },
        { 
            header => { 
                name => 'license-created-by', 
            },    
            column => { 
                field => 'created_by', 
                method => '_userIDToUserName',
            } 
        },
        { 
            header => { 
                name => 'license-date-modified', 
            },    
            column => { 
                field => 'date_modified', 
                method => '_formatDate',
                excel => 'date:Y-M-D',
            } 
        },
        { 
            header => { 
                name => 'license-modified-by', 
            },    
            column => { 
                field => 'modified_by', 
                method => '_userIDToUserName',
            } 
        },
        { 
            header => { 
                name => 'rs-license-id', 
            },    
            column => { 
                field => 'rs_id', 
            } 
        },
    );

    return \@columns;
}


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

    my $outString = 'All Products';
    my $typeID = $rowItem->$fieldName();

    if ($typeID)
    {
        # If we haven't cached all the product type ids yet, do that now.
        #
        if (! $gProductTypeIDCache)
        {
            $gProductTypeIDCache = {};
            my $allTypes = RPS::DB::Item::ProductType->GetAll();
            while (my $type = $allTypes->next())
            {
                $gProductTypeIDCache->{ $type->product_type_id() } = $type->description();
            }
            $gProductTypeIDCache->{255} = 'All Physical';
            $gProductTypeIDCache->{254} = 'All Digital';
        }
        $outString = $gProductTypeIDCache->{$typeID};
    }

    return $outString;
}

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

    my $outString;
    my $typeID = $rowItem->$fieldName();

    if ($typeID)
    {
        $outString = 'Full Stat' if RPS::DB::Item::TrackLicense::kRateTypeFull == $typeID;
        $outString = 'Min Stat' if RPS::DB::Item::TrackLicense::kRateTypeMinimum == $typeID;
        $outString = 'Penny Rate' if RPS::DB::Item::TrackLicense::kRateTypePenny == $typeID;
    }

    return $outString;
}

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

    my $outString;
    my $typeID = $rowItem->$fieldName();

    if ($typeID)
    {
        $outString = 'Sales Date' if RPS::DB::Item::TrackLicense::kRateBasisSale == $typeID;
        $outString = 'Lock Date' if RPS::DB::Item::TrackLicense::kRateBasisLock == $typeID;
    }

    return $outString;
}

sub _ls1
{
    my ($self, %args) = @_;
    return $self->_ls(1, %args);
}
sub _ls2
{
    my ($self, %args) = @_;
    return $self->_ls(2, %args);
}
sub _ls3
{
    my ($self, %args) = @_;
    return $self->_ls(3, %args);
}
sub _ls4
{
    my ($self, %args) = @_;
    return $self->_ls(4, %args);
}
sub _ls5
{
    my ($self, %args) = @_;
    return $self->_ls(5, %args);
}
sub _ls6
{
    my ($self, %args) = @_;
    return $self->_ls(6, %args);
}
sub _ls7
{
    my ($self, %args) = @_;
    return $self->_ls(7, %args);
}
sub _ls8
{
    my ($self, %args) = @_;
    return $self->_ls(8, %args);
}


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

    my $outString;
    my $id = $rowItem->$fieldName();

    if ($id)
    {
        # Just going to cache the entire freaking table.
        #
        if (! $gLiquidationScheduleCache)
        {
            $gLiquidationScheduleCache = {};

            my $items = RPS::DB::Item::ReserveLiquidation->GetAll();
            while (my $item = $items->next())
            {
                $gLiquidationScheduleCache->{ $item->id() }{ $item->type() }{ $item->period() } = $item->percent();
            }
        }

        my $type = $self->ReserveType();

        # Might be a controlled comp license, which is a different type...
        #
        if ($rowItem->type() == RPS::DB::Item::TrackLicense::kControlledComposition)
        {
            $type = RPS::DB::Item::ReserveLiquidation::kTypeControlledComposition;
            $id = $rowItem->controlled_composition_id();
        }

        $outString = $gLiquidationScheduleCache->{$id}{$type}{$period};
    }

    return $outString;
}

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


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

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


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


1;

package RPS::Report::Dynamic::Catalog::Licenses::USCABaseParameters;
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::Catalog::Parameters';


sub _OptionalData
{
    return undef;
}


1;
