#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# 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;
