package CollsInfo::CITC;

# © 2000, The Regents of The University of Michigan, All Rights Reserved
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject
# to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

BEGIN
{
    # enable strict under development
    if ( $ENV{'DLPS_DEV'} )
    {
        require "strict.pm";
        strict::import();
    }
}


BEGIN
{
    unshift ( @INC, '.' );
}

use CollsInfo;
use vars qw( @ISA );


# Subclass of CollsInfo.pm module
@ISA = qw( CollsInfo );

use DlpsUtils;

# ----------------------------------------------------------------------
#
# This module is the TextClass subclass of  CollsInfo object (which see)
#
# The structure of this object is:
# CollsInfo Object->
#   (a hash 'colls' for all authorized collections
#     {'colls'}{ $collid }  =  TextClass Object (or subclass object of TextClass)
#
#     {'authcollcount'}  = number of authorized collections
#     {'authtextscount'} = number of texts in authorized collections
#     {'reqcollcount'}   = number of requested collections
#     {'reqtextscount'}  = number of textsin requested collections
#
# This subclass adds the following additional member data
#
#     {'authcommontermsearchregions'}  = ref to list of regions, common to
#          all authorized collections, to be used in region restriction
#          pull downs for term searches (e.g., simple, prox type searches)
#     {'authcommontermregionregions'}  = ref to list of regions, common to
#          all authorized collections, to be used in region restriction
#          pull downs for region searches (e.g., boolean type searches)
#     {'reqcommontermsearchregions'}  = ref to list of regions, common to
#          all requested collections, to be used in region restriction
#          pull downs for term searches (e.g., simple, prox type searches)
#     {'reqcommontermregionregions'}  = ref to list of regions, common to
#          all requested collections, to be used in region restriction
#          pull downs for region searches (e.g., boolean type searches)
#     'reqcommongenres'}    = ref to list of genres common to all requested collections
#     'reqcommongenders'}   = ref to list of genders common to all requested collections
#     'reqcommonperiods'}   = ref to list of periods common to all requested collections
#     'reqcommonlanguages'} = ref to list of languages common to all requested collections
#
# ----------------------------------------------------------------------

# **********************************************************************
# NAME      : new
# PURPOSE   : create a CollsInfo::CITC object
# CALLED BY : main
# CALLS     : _initialize
# INPUT     : text file with delimted DB, ref to array of permitted collections
# RETURNS   : self object reference
# NOTES     :
# **********************************************************************

sub new
{
    my $class = shift;
    my $self = {};
    bless $self, $class;
    $self->SUPER::_initialize( @_ );
    
    $self->_initialize( );
    
    return $self;
}


# **********************************************************************
# NAME      : _initialize
# PURPOSE   : to populate the CollsInfo object (eventually this should be
#             a call through DBI to a database (either tab-delimited flat
#             file or other) rather than parsing the file itself
#             See the other, commented out intialized sub below.
# CALLED BY : $self->new
# CALLS     :
# INPUT     : tab-delimted file, ref to array of permitted collections
# RETURNS   : NONE
# NOTES     : adds collection info to object for just those collections
#             permitted;
#             ** eventually this should be a DBI based database access, but
#             as of now 2000-03-14 22:57:21 EST we can't get DBI::CSV to
#             work on current development machine;
#             so, simply parsing my own tab-delimted text file.
# **********************************************************************

sub _initialize
{
    my $self = shift;
    
    my ( @authCollsCommonTermSearchRegions, @authCollsCommonRegionSearchRegions,
         @reqCollsCommonTermSearchRegions, @reqCollsCommonRegionSearchRegions,
         @reqCollsCommonGenres, @reqCollsCommonGenders,
         @reqCollsCommonPeriods, @reqCollsCommonLanguages,
       );
    
    # this will eventually hold the lowest value of all the collections' LEL values
    # set high now and compare all incoming to it.
    my $lowestLel = 999;
    
    # if the line read is in the permitted collections (those in @$rColls), add to object
    foreach my $collid ( $self->GetCollIds() )
    {
        my @termsearch = $self->GetCollKeyInfo( $collid, 'termsearch' );
        my @regionsearch = $self->GetCollKeyInfo( $collid, 'regionsearch' );
        
        # Keep track of all search regions for authzd collections
        push ( @authCollsCommonTermSearchRegions, @termsearch );
        push ( @authCollsCommonRegionSearchRegions, @regionsearch );
        
        if ( $self->{'colls'}{$collid}{'requested'} )
        {
            # Keep track of all search regions for requested colls
            push ( @reqCollsCommonTermSearchRegions, @termsearch );
            push ( @reqCollsCommonRegionSearchRegions, @regionsearch );
            
            # Keep track of all genres, genders, periods and languages for requested colls
            my @genres = $self->GetCollKeyInfo( $collid, 'genres' );
            my @genders = $self->GetCollKeyInfo( $collid, 'genders' );
            my @periods = $self->GetCollKeyInfo( $collid, 'periods' );
            my @languages = $self->GetCollKeyInfo( $collid, 'languages' );
            
            push ( @reqCollsCommonGenres, @genres );
            push ( @reqCollsCommonGenders, @genders );
            push ( @reqCollsCommonPeriods, @periods );
            push ( @reqCollsCommonLanguages, @languages );
            
            # Keep track of the lowest LEL fo all requested collections
            if ( $self->{'colls'}{$collid}{'lel'} < $lowestLel )
            {
                $lowestLel = $self->{'colls'}{$collid}{'lel'};
            }
        }
    }
    
    
    # Save the "lowest common denominator" of all the LELs encountered
    $self->{'lowestlel'}  = $lowestLel;
    
    # Store away lists of common regions
    &DlpsUtils::SortUniquifyList( \@authCollsCommonTermSearchRegions );
    $self->{'authcommontermsearchregions'}  = \@authCollsCommonTermSearchRegions;
    &DlpsUtils::SortUniquifyList( \@authCollsCommonRegionSearchRegions );
    $self->{'authcommonregionsearchregions'}  = \@authCollsCommonRegionSearchRegions;
    
    &DlpsUtils::SortUniquifyList( \@reqCollsCommonTermSearchRegions );
    $self->{'reqcommontermsearchregions'}  = \@reqCollsCommonTermSearchRegions;
    &DlpsUtils::SortUniquifyList( \@reqCollsCommonRegionSearchRegions );
    $self->{'reqcommonregionsearchregions'}  = \@reqCollsCommonRegionSearchRegions;
    
    &DlpsUtils::SortUniquifyList( \@reqCollsCommonGenres );
    $self->{'reqcommongenres'}  = \@reqCollsCommonGenres;
    &DlpsUtils::SortUniquifyList( \@reqCollsCommonGenders );
    $self->{'reqcommongenders'}  = \@reqCollsCommonGenders;
    &DlpsUtils::SortUniquifyList( \@reqCollsCommonPeriods );
    $self->{'reqcommonperiods'}  = \@reqCollsCommonPeriods;
    &DlpsUtils::SortUniquifyList( \@reqCollsCommonLanguages );
    $self->{'reqcommonlanguages'}  = \@reqCollsCommonLanguages;
}


# ----------------------------------------------------------------------
# NAME         : GetLowestLel
# PURPOSE      : return the lowest of all the LEL values for requested colls
# CALLED BY    :
# CALLS        : NONE
# INPUT        : NONE
# RETURNS      : value of object's lowestLEL
# SIDE-EFFECTS : NONE
# NOTES        :
# ----------------------------------------------------------------------

sub GetLowestLel
{
    my $self = shift;
    return ( $self->{'lowestlel'} );
}


# ----------------------------------------------------------------------
# NAME         : GetAuthCollsCommonRegionsSearchRegions
# PURPOSE      : get sorted, uniq-ed list of all regionsearch region names
#                for all authorized collections
# CALLED BY    : ANY
# CALLS        : NONE
# INPUT        : NONE
# RETURNS      : array
# GLOBALS      : NONE
# SIDE-EFFECTS : NONE
# NOTES        :
# ----------------------------------------------------------------------

sub GetAuthCollsCommonRegionSearchRegions
{
    my $self = shift;
    my @returnArray = @{ $self->{'authcommonregionsearchregions'} };
    return @returnArray;
}

# ----------------------------------------------------------------------
# NAME         : GetAuthCollsCommonRegionsSearchRegions
# PURPOSE      : get sorted, uniq-ed list of all termsearch region names
#                for all authorized collections
# CALLED BY    : ANY
# CALLS        : NONE
# INPUT        : NONE
# RETURNS      : array
# GLOBALS      : NONE
# SIDE-EFFECTS : NONE
# NOTES        :
# ----------------------------------------------------------------------

sub GetAuthCollsCommonTermSearchRegions
{
    my $self = shift;
    my @returnArray = @{ $self->{'authcommontermsearchregions'} };
    return @returnArray;
}

# ----------------------------------------------------------------------
# NAME         : GetReqCollsCommonRegionsSearchRegions
# PURPOSE      : get sorted, uniq-ed list of all regionsearch region names
#                for all requested collections
# CALLED BY    : ANY
# CALLS        : NONE
# INPUT        : NONE
# RETURNS      : array
# GLOBALS      : NONE
# SIDE-EFFECTS : NONE
# NOTES        :
# ----------------------------------------------------------------------

sub GetReqCollsCommonRegionSearchRegions
{
    my $self = shift;
    my @returnArray = @{ $self->{'reqcommonregionsearchregions'} };
    return @returnArray;
}

# ----------------------------------------------------------------------
# NAME         : GetReqCollsCommonRegionsSearchRegions
# PURPOSE      : get sorted, uniq-ed list of all termsearch region names
#                for all requested collections
# CALLED BY    : ANY
# CALLS        : NONE
# INPUT        : NONE
# RETURNS      : array
# GLOBALS      : NONE
# SIDE-EFFECTS : NONE
# NOTES        :
# ----------------------------------------------------------------------

sub GetReqCollsCommonTermSearchRegions
{
    my $self = shift;
    my @returnArray = @{ $self->{'reqcommontermsearchregions'} };
    return @returnArray;
}

# ----------------------------------------------------------------------
# NAME         : GetReqCollsCommonGenres
# PURPOSE      : get sorted, uniq-ed list of all genres
#                for all requested collections
# CALLED BY    : ANY
# CALLS        : NONE
# INPUT        : NONE
# RETURNS      : array
# GLOBALS      : NONE
# SIDE-EFFECTS : NONE
# NOTES        :
# ----------------------------------------------------------------------

sub GetReqCollsCommonGenres
{
    my $self = shift;
    my @returnArray = @{ $self->{'reqcommongenres'} };
    return @returnArray;
}

# ----------------------------------------------------------------------
# NAME         : GetReqCollsCommonGenders
# PURPOSE      : get sorted, uniq-ed list of all genders
#                for all requested collections
# CALLED BY    : ANY
# CALLS        : NONE
# INPUT        : NONE
# RETURNS      : array
# GLOBALS      : NONE
# SIDE-EFFECTS : NONE
# NOTES        :
# ----------------------------------------------------------------------

sub GetReqCollsCommonGenders
{
    my $self = shift;
    my @returnArray = @{ $self->{'reqcommongenders'} };
    return @returnArray;
}


# ----------------------------------------------------------------------
# NAME         : GetReqCollsCommonPeriods
# PURPOSE      : get sorted, uniq-ed list of all periods
#                for all requested collections
# CALLED BY    : ANY
# CALLS        : NONE
# INPUT        : NONE
# RETURNS      : array
# GLOBALS      : NONE
# SIDE-EFFECTS : NONE
# NOTES        :
# ----------------------------------------------------------------------

sub GetReqCollsCommonPeriods
{
    my $self = shift;
    my @returnArray = @{ $self->{'reqcommonperiods'} };
    return @returnArray;
}

# ----------------------------------------------------------------------
# NAME         : GetReqCollsCommonPeriods
# PURPOSE      : get sorted, uniq-ed list of all periods
#                for all requested collections
# CALLED BY    : ANY
# CALLS        : NONE
# INPUT        : NONE
# RETURNS      : array
# GLOBALS      : NONE
# SIDE-EFFECTS : NONE
# NOTES        :
# ----------------------------------------------------------------------

sub GetReqCollsCommonLanguages
{
    my $self = shift;
    my @returnArray = @{ $self->{'reqcommonlanguages'} };
    return @returnArray;
}

# ----------------------------------------------------------------------
# NAME         : GetTotalRecords
# PURPOSE      : retrieve total records in all collections
# CALLED BY    : TextClassUtils::BuildTotalResultsString
# CALLS        : NONE
# INPUT        : NONE
# RETURNS      : total records in all collections
# SIDE-EFFECTS : NONE
# NOTES        :
# ----------------------------------------------------------------------

sub GetTotalRecords
{
    my $self = shift;
    return $self->{'totalrecords'};
}

# ----------------------------------------------------------------------
# NAME         : SetTotalRecords
# PURPOSE      : store total records in all collections
# CALLED BY    : $self->UpdateCrossCollNumbers
# CALLS        : NONE
# INPUT        : number of records
# RETURNS      : NONE
# SIDE-EFFECTS : sets data value in this object
# NOTES        :
# ----------------------------------------------------------------------

sub SetTotalRecords
{
    my $self = shift;
    my $n    = shift;

    $self->{'totalrecords'} = $n;
}

# ----------------------------------------------------------------------
# NAME         : GetTotalHits
# PURPOSE      : retrieve total matches in all collections
# CALLED BY    : TextClassUtils::BuildTotalResultsString
# CALLS        : NONE
# INPUT        : NONE
# RETURNS      : number of total matches
# SIDE-EFFECTS : NONE
# NOTES        :
# ----------------------------------------------------------------------

sub GetTotalHits
{
    my $self = shift;
    return $self->{'totalhits'};
}

# ----------------------------------------------------------------------
# NAME         : SetTotalHits
# PURPOSE      : store total matches in all collections
# CALLED BY    : $self->UpdateCrossCollNumbers
# CALLS        : NONE
# INPUT        : number
# RETURNS      : NONE
# SIDE-EFFECTS : sets data value in this CollsInfo object
# NOTES        :
# ----------------------------------------------------------------------

sub SetTotalHits
{
    my $self = shift;
    my $n    = shift;
    $self->{'totalhits'} = $n;
}




1;  # Truth