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

package RPS::Report::Dynamic::Licenses::UK;

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 Common::Client;
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::DynamicReport::Licenses::UK;

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


sub Group   { 'Licenses'; }
sub Type    { 'UK Mechanicals'; }
sub FilenameType { 'UK Licenses' }
sub ClientTypeMask { return Common::Client::kUKMechanicals; }


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};
}


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


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

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

    return RPS::DB::Item::DynamicReport::Licenses::UK->ReportQuery
    (
        dateType => $dateType,
        startDate => $self->parameters()->{Criteria}->StartDate(),
        endDate => $self->parameters()->{Criteria}->EndDate(),
    );
}


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

    return
    [
        { 
            header => { 
                name => 'album-title', 
            }, 
            column => { 
                field => 'album_title', 
            } 
        },
        { 
            header => { 
                name => 'catalog-no', 
            }, 
            column => { 
                field => 'catalog_number', 
            } 
        },
        { 
            header => { 
                name => 'artist', 
            },       
            column => { 
                field => 'artist', 
            } 
        },
        { 
            header => { 
                name => 'status', 
            },   
            column => { 
                field => 'album_status', 
            } 
        },
        { 
            header => { 
                name => 'product-type', 
            },   
            column => { 
                field => 'product_type_description', 
#                method => '_productTypeIDToString', 
            } 
        },
        { 
            header => { 
                name => 'product-id', 
            },   
            column => { 
                field => 'product_code', 
            } 
        },
        { 
            header => { 
                name => 'mcps-id', 
            },   
            column => { 
                field => 'mcps_id', 
            } 
        },

        { 
            header => { 
                name => 'dvd-category', 
            },   
            column => { 
                field => 'dvd_category', 
            } 
        },

        { 
            header => { 
                name => 'product-status', 
            },   
            column => { 
                field => 'product_status', 
            } 
        },
        {
            header => { 
                name => 'upc', 
            },   
            column => { 
                field => 'upc', 
            } 
        },
        {
            header => { 
                name => 'deleted', 
            },   
            column => { 
                field => 'deleted', 
            } 
        },
        {
            header => { 
                name => 'deletion-date', 
            },   
            column => { 
                field => 'deleted_date', 
                method => '_formatDate',
                excel => 'date:Y-M-D',
            } 
        },
        { 
            header => { 
                name => 'release-date', 
            },  
            column => { 
                field => 'release_date', 
                method => '_formatDate',
                excel => 'date:Y-M-D',
            } 
        },
        { 
            header => { 
                name => 'current-default-price', 
            },    
            column => { 
                field => 'default_price', 
                method => '_priceWithDefaultPriceLevel',
            } 
        },
        { 
            header => { 
                name => 'payor', 
            },  
            column => { 
                field => 'payor', 
            } 
        },
        { 
            header => { 
                name => 'supplier-code', 
            },           
            column => { 
                field => 'supplier_code', 
            } 
        },
        { 
            header => { 
                name => 'tv-advertised', 
            },           
            column => { 
                field => 'tv_advertised', 
            } 
        },
        { 
            header => { 
                name => 'initial-periods-completed', 
            },           
            column => { 
                field => 'periods_completed', 
            } 
        },
        { 
            header => { 
                name => 'hr-p1-no-held', 
            },         
            column => { 
                field => 'retentions_period_1', 
            } 
        },
        { 
            header => { 
                name => 'hr-p1-price-tier', 
            },         
            column => { 
                field => 'price_tier_period_1', 
                method => '_priceTierWithPriceLevel',
            } 
        },
        { 
            header => { 
                name => 'hr-p2-no-held', 
            },         
            column => { 
                field => 'retentions_period_2', 
            } 
        },
        { 
            header => { 
                name => 'hr-p2-price-tier', 
            },         
            column => { 
                field => 'price_tier_period_2', 
                method => '_priceTierWithPriceLevel',
            } 
        },
        { 
            header => { 
                name => 'hr-p3-no-held', 
            },         
            column => { 
                field => 'retentions_period_3', 
            } 
        },
        { 
            header => { 
                name => 'hr-p3-price-tier', 
            },         
            column => { 
                field => 'price_tier_period_3', 
                method => '_priceTierWithPriceLevel',
            } 
        },
        { 
            header => { 
                name => 'hr-p4-no-held', 
            },         
            column => { 
                field => 'retentions_period_4', 
            } 
        },
        { 
            header => { 
                name => 'hr-p4-price-tier', 
            },         
            column => { 
                field => 'price_tier_period_4', 
                method => '_priceTierWithPriceLevel',
            } 
        },
#        { 
#            header => { 
#                name => 'date-created', 
#            },    
#            column => { 
#                field => 'date_created', 
#                method => '_formatDate',
#            } 
#        },
#        { 
#            header => { 
#                name => 'created-by', 
#            },    
#            column => { 
#                field => 'created_by', 
#                method => '_userIDToUserName',
#            } 
#        },
#        { 
#            header => { 
#                name => 'date-modified', 
#            },    
#            column => { 
#                field => 'date_modified', 
#                method => '_formatDate',
#            } 
#        },
#        { 
#            header => { 
#                name => 'modified-by', 
#            },    
#            column => { 
#                field => 'modified_by', 
#                method => '_userIDToUserName',
#            } 
#        },
        { 
            header => { 
                name => 'rs-product-id', 
            },    
            column => { 
                field => 'product_id', 
            } 
        },
    ];
}


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->{254} = 'All Physical';
            $gProductTypeIDCache->{255} = 'All Digital';
        }
        $outString = $gProductTypeIDCache->{$typeID};
    }

    return $outString;
}

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

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

    if ($typeID)
    {
        # If we haven't cached all the product type ids yet, do that now.
        #
        $outString = 'Full' if 1 == $typeID;
        $outString = 'Mid' if 2 == $typeID;
        $outString = 'Budget' if 3 == $typeID;
        $outString = 'Album Download' if 4 == $typeID;
        $outString = 'Track Download' if 5 == $typeID;
        $outString = 'Promo' if 6 == $typeID;
    }

    return $outString;
}

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

    # Get the price associated with the period number
    #
    my $priceName;
    if ( $fieldName =~ /_(\d)$/ )
    {
        $priceName = "price_period_$1";
    }

    my $outString = $self->_priceLevelToString( %args ) || "";

    if( $priceName && $outString)
    {
        my $priceValue = $rowItem->$priceName();
        $outString .= " / $priceValue";
    }

    return $outString;
}

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

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

    my $defaultPriceName = "default_price_level";

    my $outString = $price;

    my $priceLevel = $self->_priceLevelToString( row => $rowItem, field => $defaultPriceName ) || "";

    if( $priceLevel )
    {
        $outString = " $priceLevel / $price";
    }

    return $outString;
}

1;

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