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

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use RPS::Expense::ExpenseList;
use RPS::Expense::ExpenseTypeList;
use RPS::LabelList;
use RPS::RoyaltyRun::RoyaltyRunStatusList;
use RPS::DB::Item::NewArtistContractTerm;

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

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

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

    my $parentID   = $args{albumContractID};
    my $expenseID  = $args{expenseID};
    my $parentType = RPS::DB::Item::Expense::kParentAlbumContract();

    # one or the other
    #
    # Here's the funny thing: We don't really want to _edit_ the AlbumContractExpense object directly.
    # So, there's no good reason to make it editable.
    #
    if ($expenseID) {
        $self->{Expense} = RPS::Expense::Expense->new( expenseID => $expenseID );
    } else {

        # this means just display the lists
        $self->{Expense} =
          RPS::Expense::Expense->new( parentID => $parentID, parentType => RPS::DB::Item::Expense::kParentAlbumContract() );
    }

    # jpk - AlbumContractExpense will not contain AlbumContract anymore.
    # Instead, I'll just instantiate one of those as a peer, here in the form.
    #
    $self->{AlbumContract} = RPS::Catalog::AlbumContract->new(
        albumContractID => $parentID,
        loadSubs        => 0,
        readOnly        => 1,
    );

    $self->{_contractID} = $self->{AlbumContract}->ContractID();

    $self->{Album} = RPS::Catalog::AlbumSimple->new(
        albumID  => $self->{AlbumContract}->AlbumID(),
        loadSubs => 0,
        readOnly => 1,
    );

    $self->{LabelList} = RPS::LabelList->new();

    # Put some placeholders in here for editing purposes
    #
    $self->{ExpenseList} =
      RPS::Expense::ExpenseList->new( parentID => $parentID, parentType => RPS::DB::Item::Expense::kParentAlbumContract() );
    $self->{ExpenseTypeList} = RPS::Expense::ExpenseTypeList->new( artistContractID => $self->{_contractID} );

    $self->{RoyaltyRunStatus} = new RPS::RoyaltyRun::RoyaltyRunStatusList( artist => 1 );

    #
    # Check for missing or invalid (inactive or zero rate) default term
    # which would cause problems with net revenue deductions during an
    # artist royalty run.
    #
    my $invalidDefaultTerm = $self->_invalidDefaultTerm();
    if ($invalidDefaultTerm) {
        $self->{DefaultTerm} = Common::FormObject::Scalar::Integer->new( value => $invalidDefaultTerm );
    }

    return $self;
}

# _invalidDefaultTerm - check if the contract is missing a default term
# or if the existing default term is valid.  Returns 0 if valid, or a
# status code indicating the problem (the status code is used in the
# expense xsl).
sub _invalidDefaultTerm {
    my ($self) = @_;

    my $invalid = 0;

    my $default = RPS::DB::Item::NewArtistContractTerm->GetDefault( $self->contractID() );

    if ( !$default ) {
        $invalid = 1;    # Missing default term
    } else {
        if ( $default->rate == 0 ) {
            $invalid = 3;    # Zero-rate default term
        }
    }

    return $invalid;
}

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

    $self->{Expense}->validate();
}

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

    $self->{Expense}->save();
}

sub contractID {
    my ($self) = @_;
    return $self->{_contractID};
}

###
1;    #
###
