#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package RPS::DB::Item::AlbumContract;
use strict;
use warnings;
use lib '/app/tools/common/lib';
use Common::DB::Item;
use Common::RSApp;
use Common::DB::ItemCollection;
use Common::Assert;
use base 'Common::DB::Item';

use constant kTable => 'album_contract';
use constant kDB    => Common::DB::Item::kClientDB();

use constant kStatusActive   => 1;
use constant kStatusInactive => 2;

sub SetAsControlledComp {
    my ( $class, $albumID, $albumContractID ) = @_;

    # First, set the 'is_controlled_comp' flag to 0 for everybody
    #
    my $dbo = Common::RSApp::GetClientDB();
    $dbo->DoCmd( "UPDATE " . kTable . " SET is_controlled_comp=0 WHERE album_id = " . $dbo->DBQuote($albumID) );

    # Now select the new one, if specified.
    #
    if ($albumContractID) {
        $dbo->DoCmd( "UPDATE " . kTable . " SET is_controlled_comp=1 WHERE album_contract_id = " . $dbo->DBQuote($albumContractID) );
    }
}

sub SetAsCAControlledComp {
    my ( $class, $albumID, $albumContractID ) = @_;

    # First, set the 'is_ca_controlled_comp' flag to 0 for everybody
    #
    my $dbo = Common::RSApp::GetClientDB();
    $dbo->DoCmd( "UPDATE " . kTable . " SET is_ca_controlled_comp=0 WHERE album_id = " . $class->quote($albumID) );

    # Now select the new one, if specified.
    #
    if ($albumContractID) {
        $dbo->DoCmd( "UPDATE " . kTable . " SET is_ca_controlled_comp=1 WHERE album_contract_id = " . $class->quote($albumContractID) );
    }
}

sub GetCComp {
    my ( $class, $albumID, $ccomp ) = @_;
    assert($albumID);

    my $sql = "SELECT * FROM " . kTable . " WHERE album_id = " . $class->quote($albumID) . " AND is_controlled_comp=1";

    my $collection = Common::DB::ItemCollection->new(
        class => "RPS::DB::Item::AlbumContract",
        query => $sql,
        dbID  => kDB,
    );

    return ( $collection->size ) ? $collection->next() : undef;
}

sub GetCACComp {
    my ( $class, $albumID, $ccomp ) = @_;
    assert($albumID);

    my $sql = "SELECT * FROM " . kTable . " WHERE album_id = ". $class->quote($albumID) . " AND is_ca_controlled_comp=1";

    my $collection = Common::DB::ItemCollection->new(
        class => "RPS::DB::Item::AlbumContract",
        query => $sql,
        dbID  => kDB,
    );

    return ( $collection->size ) ? $collection->next() : undef;
}

sub GetByContractIDAlbumID {
    my ( $class, $contractID, $albumID ) = @_;
    assert($contractID);
    assert($albumID);

    my $sql = "SELECT * FROM "
    . kTable
    . " WHERE artist_contract_id = "
    . $class->quote($contractID)
    . " AND album_id = "
    . $class->quote($albumID);

    my $collection = Common::DB::ItemCollection->new(
        class => "RPS::DB::Item::AlbumContract",
        query => $sql,
        dbID  => kDB,
    );

    return ( $collection && $collection->hasNext ) ? $collection->next : undef;
}

sub GetByAlbumID {
    my ( $class, $albumID ) = @_;
    assert($albumID);

    my $sql = "SELECT * FROM " . kTable . " WHERE album_id = " . $class->quote($albumID);

    return $class->SUPER::GetAll($sql);
}

sub GetByAlbumIDThatHaveControlledComp {
    my ( $class, $albumID ) = @_;
    assert($albumID);

    my $sql =
        "SELECT * FROM "
      . kTable
      . " WHERE album_id = "
      . $class->quote($albumID)
      . " and artist_contract_id in (select artist_contract_id from controlled_composition)";

    return $class->SUPER::GetAll($sql);
}

sub GetByContractID {
    my ( $class, $contractID ) = @_;
    assert($contractID);

    my $sql = "SELECT * FROM " . kTable . " WHERE artist_contract_id = " . $class->quote($contractID);

    return $class->SUPER::GetAll($sql);
}

sub GetCrossCollateralized {
    my ($class) = @_;

    my $sql = "SELECT * FROM " . kTable . " where cross_collateralized=1";

    return $class->SUPER::GetAll($sql);
}

sub GetByPayorIDArtistIDAlbumID {
    my ( $class, $payorID, $artistPayeeID, $albumID ) = @_;
    assert($payorID);
    assert($artistPayeeID);
    assert($albumID);

    my $sql =
        "SELECT * FROM "
      . kTable
      . " WHERE album_id = "
      . $class->quote($albumID)
      . " AND artist_contract_id IN "
      . " (SELECT artist_contract_id FROM new_artist_contract WHERE deleted = 0 AND artist_payee_id = "
      . $class->quote($artistPayeeID)
      . " AND payor_id = "
      . $class->quote($payorID) . ")";

    my $collection = Common::DB::ItemCollection->new(
        class => "RPS::DB::Item::AlbumContract",
        query => $sql,
        dbID  => kDB,
    );

    assert( $collection->size < 2 );

    return $collection->next;
}

sub HasBeenIncludedInRoyaltyRun {
    my ( $class, $albumContractID ) = @_;

    my $item = $class->Lookup( album_contract_id => $albumContractID );
    return undef unless $item;

    my $dbo = Common::RSApp->GetClientDB();

    my $sql =
      "SELECT COUNT(*) FROM artist_royalty_income_item"
      . " INNER JOIN new_artist_contract_term USING (artist_contract_term_id)"
      . " WHERE album_id = "
      . $dbo->DBQuote( $item->album_id )
      . " AND artist_contract_id = "
      . $dbo->DBQuote( $item->artist_contract_id );

    my $sth   = $dbo->DoCmd($sql);
    my $hr    = $sth->fetchrow_hashref();
    my $count = $hr->{"COUNT(*)"};
    return ( $count > 0 );
}

1;

