#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#------------------------------------------------------------
package RPS::ArtistContract::DefaultTerm;

use strict;
use warnings;
use Carp;

use lib '/app/tools/common/lib';
use Common::Assert;

use lib '/app/tools/rps/lib';
use RPS::DB::Item::AlbumContract;
use RPS::DB::Item::ContractRateType;
use RPS::DB::Item::Expense;
use RPS::DB::Item::NewArtistContract;
use RPS::DB::Item::NewArtistContractTerm;
use RPS::DB::Item::TrackContract;
use RPS::ArtistContract::ProductFormat;
use RPS::ArtistContract::ChannelList;
use RPS::Region::RegionList;

use Common::FormObject;
use base 'Common::FormObject';


sub _init
{
    my ($self, %args) = @_;

    $self->SUPER::_init(%args);

    my %properties;

    if($args{_dbItem})
    {
        $self->_propertiesFromDBItem(\%properties, $args{_dbItem});
    }
    elsif($args{artistContractID})
    {
		# this is a special contract term known as the "Default" term. It's special attribute is priority=0.
		# There should only be one per contract and we'll always look it up by contract, so hence this
		# funky _init procedure. -jff-
		#
		my $dbItem = RPS::DB::Item::NewArtistContractTerm->GetDefault($args{artistContractID});
		if($dbItem)
		{
        	$self->_propertiesFromDBItem(\%properties, $dbItem);
		}
		else
		{
        	$self->_propertiesFromDefaults(\%properties, $args{artistContractID});
		}
    }
    else
    {
		$self->_propertiesFromDefaults(\%properties);
    }

    $self->_initProperties(\%properties);
    $self->_initSubs(\%properties);

    return $self;
}


sub _propertiesFromDB
{
    my ($self, $hrProperties, $id) = @_;
}


sub _propertiesFromDBItem
{
	my ($self, $hrProperties, $dbItem) = @_;

	$self->{_inDB} = 1;

    $hrProperties->{artist_contract_term_id} = $dbItem->artist_contract_term_id;
    $hrProperties->{artist_contract_id} = $dbItem->artist_contract_id;
    $hrProperties->{priority} = $dbItem->priority;
    $hrProperties->{contract_term_source_id} = $dbItem->contract_term_source_id;
    $hrProperties->{region_id} = $dbItem->region_id;
    $hrProperties->{channel_id} = $dbItem->channel_id;
    $hrProperties->{price_level_id} = $dbItem->price_level_id;
    $hrProperties->{contract_rate_type_id} = $dbItem->contract_rate_type_id;
    $hrProperties->{rate} = $dbItem->rate;
    $hrProperties->{inactive} = $dbItem->inactive;

    $hrProperties->{date_created} = $dbItem->date_created;
    $hrProperties->{date_modified} = $dbItem->date_modified;
    $hrProperties->{created_by} = $dbItem->created_by;
    $hrProperties->{modified_by} = $dbItem->modified_by;

    # If the following fields are null, we'll go ahead and set them to the default values.
    # These values are also repeated in sub _propertiesFromDefaults. -rdd
    my $rate_reduction = $dbItem->rate_reduction;
    if ($rate_reduction > 0)
    {
    		$hrProperties->{rate_reduction} = $rate_reduction;
    }
    else
    {
    		$hrProperties->{rate_reduction} = 100;
    }
    my $percentage_of_sales = $dbItem->percentage_of_sales;
    if ($percentage_of_sales > 0)
    {
    		$hrProperties->{percentage_of_sales} = $percentage_of_sales;
    }
    else
    {
    		$hrProperties->{percentage_of_sales} = 100;
    }
    my $packaging_deduction = $dbItem->packaging_deduction;
    if ($packaging_deduction > 0)
    {
    		$hrProperties->{packaging_deduction} = $packaging_deduction;
    }
    else
    {
    		$hrProperties->{packaging_deduction} = 0;
    }
    my $free_goods_deduction = $dbItem->free_goods_deduction;
    if ($free_goods_deduction > 0)
    {
    		$hrProperties->{free_goods_deduction} = $free_goods_deduction;
    }
    else
    {
    		$hrProperties->{free_goods_deduction} = 0;
    }
}


sub _initProperties
{
    my ($self, $props) = @_;

    $self->{ArtistContractTermID}	= Common::FormObject::Scalar->new(value => $props->{artist_contract_term_id});
    $self->{ArtistContractID}		= Common::FormObject::Scalar->new(value => $props->{artist_contract_id});
    $self->{Priority}		    	= Common::FormObject::Scalar->new(value => $props->{priority});
    $self->{ContractTermSourceID}	= Common::FormObject::Scalar->new(value => $props->{contract_term_source_id});
    $self->{RegionID}				= Common::FormObject::Scalar->new(value => $props->{region_id});
    $self->{ChannelID}				= Common::FormObject::Scalar->new(value => $props->{channel_id});
    $self->{PriceLevelID}			= Common::FormObject::Scalar->new(value => $props->{price_level_id});
    $self->{ContractRateTypeID}		= Common::FormObject::Scalar->new(value => $props->{contract_rate_type_id});
    $self->{Rate}					= Common::FormObject::Scalar::Percent->new(value => $props->{rate}, precision => '.4');
    $self->{RateReduction}			= Common::FormObject::Scalar::Percent->new(value => $props->{rate_reduction});
    $self->{PercentageOfSales}		= Common::FormObject::Scalar::Percent->new(value => $props->{percentage_of_sales});
    $self->{PackagingDeduction}		= Common::FormObject::Scalar::Percent->new(value => $props->{packaging_deduction});
    $self->{FreeGoodsDeduction}		= Common::FormObject::Scalar::Percent->new(value => $props->{free_goods_deduction});
    $self->{Inactive}        		= Common::FormObject::Scalar->new(value => $props->{inactive});

    $self->{CreatedDate}        = Common::FormObject::Scalar::DateTime->new(value => $props->{ date_created}, readOnly => 1);
    $self->{ModifiedDate}       = Common::FormObject::Scalar::DateTime->new(value => $props->{ date_modified}, readOnly => 1);
    $self->{CreatedBy}          = Common::FormObject::Scalar::UserName->new(value => $props->{ created_by}, readOnly => 1);
    $self->{ModifiedBy}         = Common::FormObject::Scalar::UserName->new(value => $props->{ modified_by}, readOnly => 1);

    my $dependancies = RPS::DB::Item::NewArtistContractTerm->GetTermDependencyByArtistContractID($self->ArtistContractID);
	$self->{HasDependency} = $dependancies->{$self->ArtistContractTermID} ? 1 : 0;
}


sub _initSubs
{
    my ($self, $props) = @_;

	if($self->loadSubs())
	{
	}
}


sub _propertiesFromDefaults
{
    my ($self, $hrProperties, $contractID) = @_;

    $hrProperties->{artist_contract_id} = $contractID;
    $hrProperties->{priority} = 0;
    $hrProperties->{rate_reduction} = 100;
    $hrProperties->{percentage_of_sales} = 100;
    $hrProperties->{packaging_deduction} = 0;
    $hrProperties->{free_goods_deduction} = 0;
    $hrProperties->{inactive} = 1;
}

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

	my $valid = 1;
	# if anything was entered then try to validate
	#
	if( $self->Inactive && $self->Rate() == 0 && $self->ArtistContractID())
	{	
	    my $unprocessedExpenses = 0;
	    # If there are unprocessed net revenue expenses,
	    # the rate cannot be zero.
	    
	    # First check the album contracts
	    my $albumContracts = RPS::DB::Item::AlbumContract->GetByContractID($self->ArtistContractID());
	    while ($albumContracts->hasNext())
	    {
	        my $albumContract = $albumContracts->next();
	        my $albumContractID = $albumContract->album_contract_id; 
	        my $albumExpenseCount = RPS::DB::Item::Expense->GetNumUnprocessedPreProcess($albumContractID, RPS::DB::Item::Expense::kParentAlbumContract);
	        $unprocessedExpenses += $albumExpenseCount;
	        
	    }
	    # And now for the track contracts
	    my $trackContracts = RPS::DB::Item::TrackContract->GetByContractID($self->ArtistContractID());
	    while ($trackContracts->hasNext())
	    {
	        my $trackContract = $trackContracts->next();
	        my $trackContractID = $trackContract->track_contract_id; 
	        my $trackExpenseCount = RPS::DB::Item::Expense->GetNumUnprocessedPreProcess($trackContractID, RPS::DB::Item::Expense::kParentTrackContract);
	        $unprocessedExpenses += $trackExpenseCount;
	    }	        

	    if ($unprocessedExpenses == 0)
	    {
	        $valid = $self->SUPER::validate();
        } else {
		    $valid = undef;
		    $self->{Rate}->setErrorString( 'Default rate cannot be 0' );	
		}    
	} elsif( $self->Inactive || ($self->Rate() && $self->Rate() != 0) ) {
    	$valid = $self->SUPER::validate();
	} else {
		$valid = undef;
		$self->{Rate}->setErrorString( 'Default rate cannot be 0' );
	}



	return $valid;
}


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

	my $dbObj;
	if($self->ArtistContractTermID())
	{
		# let's check for a deletion here
		#
		if(!$self->Rate())
		{
			# i guess we should delete in this case
			#
			return $self->delete();
		}
		else
		{
			$dbObj = RPS::DB::Item::NewArtistContractTerm->Lookup(artist_contract_term_id => $self->ArtistContractTermID());
            $dbObj->modified_by($self->ModifiedBy());
            $dbObj->date_modified(Common::DB::Item::kDateTimeNow);

		}
	}
	else
	{
		# don't save something that wasn't entered.
		#
		if(!$self->Rate())
		{
			return 1;
		}

		$dbObj = RPS::DB::Item::NewArtistContractTerm->Create();
        $dbObj->created_by($self->CreatedBy());
        $dbObj->date_created(Common::DB::Item::kDateTimeNow);

	}

	# set fields here
	#
	$dbObj->artist_contract_id($self->ArtistContractID());
    $dbObj->priority(0);
    $dbObj->contract_rate_type_id(RPS::DB::Item::ContractRateType::kRateTypePercentRevenue());
    $dbObj->rate($self->Rate());
    # $dbObj->priority($self->Priority());
    # $dbObj->income_source_id($self->IncomeSourceID());
    # $dbObj->region_id($self->RegionID());
    # $dbObj->channel_id($self->ChannelID());
    # $dbObj->price_level_id($self->PriceLevelID());
    # $dbObj->contract_rate_type_id($self->ContractRateTypeID());

    # We will translate a '0' rate_reduction to 100.
    #
    $dbObj->rate_reduction( $self->RateReduction() > 0 ? $self->RateReduction() : 100);
    $dbObj->percentage_of_sales( $self->PercentageOfSales() > 0 ? $self->PercentageOfSales() : 100);

    $dbObj->packaging_deduction($self->PackagingDeduction());
    $dbObj->free_goods_deduction($self->FreeGoodsDeduction());
    $dbObj->inactive($self->Inactive());

	# save db item
	#
	$dbObj->save();

	# reload object
	#
	$self->_init(_dbItem => $dbObj);
}



sub delete
{
	my $self = shift;

	if($self->{_inDB})
	{
		my $myDBObj = RPS::DB::Item::NewArtistContractTerm->Lookup(artist_contract_term_id => $self->ArtistContractTermID());
		$myDBObj->delete();
	}
    return 1;
}


###
1;#
###
