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

use strict;
use warnings;

use lib '/app/tools/common/lib';
use Common::Assert;
use Common::DB::ItemCollection;
use Common::DB::Item;
use base 'Common::DB::Item';

use constant kTable => 'contract_term_source';
use constant kDB    => Common::DB::Item::kCommonDB();

use constant kContractTermSourceAll                 => 1;
use constant kContractTermSourceAllPhysical         => 2;
use constant kContractTermSourceAllDigital          => 3;
use constant kContractTermSourceMasterLicense       => 4;
use constant kContractTermSourceSyncLicense         => 5;
use constant kContractTermSourceCD                  => 6;
use constant kContractTermSourceLP                  => 7;
use constant kContractTermSourceCassette            => 8;
use constant kContractTermSourceDVDCDSet            => 9;
use constant kContractTermSourceCDSingle            => 10;
use constant kContractTermSourceDblCD               => 11;
use constant kContractTermSourceDVD                 => 12;
use constant kContractTermSourceVHS                 => 13;
use constant kContractTermSourceLP5                 => 14;
use constant kContractTermSourceDigitalAlbum        => 15;
use constant kContractTermSourceDigitalTrack        => 16;
use constant kContractTermSourceDigitalStream       => 17;
use constant kContractTermSourceDigitalTethered     => 18;
use constant kContractTermSourceRingtone            => 19;
use constant kContractTermSourceJukebox             => 20;
use constant kContractTermSourceDualDownload        => 21;
use constant kContractTermSourceBackground          => 22;
use constant kContractTermSourceVPD                 => 23;
use constant kContractTermSourceDigitalAlbumPremium => 24;
use constant kContractTermSourceDigitalTrackPremium => 25;
use constant kContractTermSourceDigitalAlbumUpgrade => 26;
use constant kContractTermSourceDigitalTrackUpgrade => 27;
use constant kContractTermSourceCassetteSingle      => 28;
use constant kContractTermSourceBluRay              => 29;
use constant kContractTermSourcePerformanceIncome   => 30;
use constant kContractTermSourceAllPerformance      => 31;
use constant kContractTermSourceEphemeral           => 32;
use constant kContractTermSourceNonEphemeral        => 33;
use constant kContractTermSourceOrchardSync         => 34;

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

    my $sql = "SELECT * FROM " . kTable . " ORDER BY parent_contract_term_source_id,name";
    return $class->SUPER::GetAll($sql);
}

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

    # !!! This is NOT going to return a DB::Item collection.
    # !!! Just going to return a hash of array references.
    #
    my %hash;
    my $dbo = Common::RSApp::GetCommonDB();
    my $sql = "SELECT * FROM contract_term_income_source";
    my $sth = $dbo->DoCmd($sql);
    while ( my $hr = $sth->fetchrow_hashref() ) {
        push @{ $hash{ $hr->{income_source_id} } }, $hr->{contract_term_source_id};
    }

    return \%hash;
}

sub hasDigital {
    my $class                = shift;
    my $contractTermSourceID = shift || return;
    my $dbo                  = Common::RSApp::GetCommonDB;

    assert($contractTermSourceID);

    my $sql =
        "SELECT * FROM "
      . kTable . " "
      . "INNER JOIN contract_term_income_source USING ( contract_term_source_id ) "
      . "INNER JOIN income_source USING (income_source_id) "
      . "WHERE format IN (2,3) AND "
      . "contract_term_source_id = "
      . $dbo->DBQuote($contractTermSourceID);

    my $collection = $class->SUPER::GetAll($sql);
    return $collection->hasNext;
}

sub hasPhysical {
    my $class                = shift;
    my $contractTermSourceID = shift || return;
    my $dbo                  = Common::RSApp::GetCommonDB;

    assert($contractTermSourceID);

    my $sql =
        "SELECT * FROM "
      . kTable . " "
      . "INNER JOIN contract_term_income_source USING ( contract_term_source_id ) "
      . "INNER JOIN income_source USING (income_source_id) "
      . "WHERE format = 1 AND "
      . "contract_term_source_id = "
      . $dbo->DBQuote($contractTermSourceID);

    my $collection = $class->SUPER::GetAll($sql);
    return $collection->hasNext;
}

sub containsIncomeSource {
    my $class                = shift;
    my $incomeSourceID       = shift || return;
    my $contractTermSourceID = shift || return;
    my $dbo                  = Common::RSApp::GetCommonDB;

    assert($contractTermSourceID);

    my $sql =
        "SELECT * FROM "
      . kTable . " "
      . "INNER JOIN contract_term_income_source USING ( contract_term_source_id ) "
      . "WHERE  "
      . "contract_term_source_id = "
      . $dbo->DBQuote($contractTermSourceID) . " AND "
      . "income_source_id = "
      . $dbo->DBQuote($incomeSourceID);

    my $collection = $class->SUPER::GetAll($sql);

    return $collection->hasNext();
}
1;
