#---------------------------------------------------------------
# ____                   _ _         ____  _                    
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___ 
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/                            
#
# Copyright (C) 2009 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#---------------------------------------------------------------
package BookPub::Catalog::BookSubject;
use strict;
use warnings;

use lib '/app/tools/common/lib';
use lib '/app/tools/bookpub/lib';
use BookPub::DB::Item::BookSubject;
use Common::RSApp;
use Common::Util;
use Common::Assert;
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{bookSubjectID})
	{
		$self->_propertiesFromDB(\%properties, $args{bookSubjectID});
	}
    else
	{
		$self->_propertiesFromDefaults(\%properties);
	}

    $self->_initProperties(\%properties);

    return $self;
}


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

	my $dbItem = BookPub::DB::Item::BookSubject->Lookup(book_subject_id => $id);

	$self->_propertiesFromDBItem($hrProperties, $dbItem);
}


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

    $hrProperties->{book_subject_id} = $dbItem->book_subject_id;
	$hrProperties->{book_id}        = $dbItem->book_id;
	$hrProperties->{subject_code}   = $dbItem->bisac_subject_code;
}


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

    $self->{SubjectID}          = Common::FormObject::Scalar->new(value => $props->{book_subject_id});
	$self->{BookID}             = Common::FormObject::Scalar->new(value => $props->{book_id}); 
	$self->{SubjectCode}        = Common::FormObject::Scalar->new(value => $props->{subject_code}); 

    # Going to add in a 'placeholder' element, to catch form requests to delete this object.
    #
    $self->{Delete} = Common::FormObject::Scalar::Boolean->new(value => 0);
}


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

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

    my $dbObj = $self->_saveBookSubject(%args);
    if ($dbObj)
    {
        $self->_init(_dbItem => $dbObj);
    }
    else
    {
        $self->_init();
    }
}

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

    if ($self->SubjectID())
    {
		my $dbObj = BookPub::DB::Item::BookSubject->Lookup(book_subject_id => $self->SubjectID());
        $dbObj->delete();
    }
}

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

    if ($args{bookID})
    {
        $self->BookID($args{bookID});
    }

	my $dbObj;
	if ($self->SubjectID())
	{
		$dbObj = BookPub::DB::Item::BookSubject->Lookup(book_subject_id => $self->SubjectID());
	}
	else
	{
        # If we don't have a subject code, don't bother creating a new object.
        #
        return undef unless (defined $self->SubjectCode());
		$dbObj = BookPub::DB::Item::BookSubject->Create();
	}

    $dbObj->book_id($self->BookID());
    $dbObj->bisac_subject_code($self->SubjectCode());

	$dbObj->save();

    return $dbObj;
}


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

    # Don't need to really do anything if we don't have an ID yet.
    #
    if ($self->SubjectID())
    {
		my $dbObj = BookPub::DB::Item::BookSubject->Lookup(book_subject_id => $self->SubjectID());
        $dbObj->delete();
    }
}

###
1;#
###
