package Koha::Libraries;

# Copyright 2015 Koha Development team
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with Koha; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

use Modern::Perl;

use Carp;

use C4::Context;

use Koha::Biblios;
use Koha::Database;
use Koha::Item::Transfer::Limits;
use Koha::Items;
use Koha::Library;
use Koha::Patrons;

use base qw(Koha::Objects);

=head1 NAME

Koha::Libraries - Koha Library Object set class

=head1 API

=head2 Class Methods

=cut

=head3 pickup_locations

Returns available pickup locations (Koha::Library objects) for
    A. a specific item
    B. a biblio
    C. none of the above, simply all libraries with pickup_location => 1

This method determines the pickup location by two factors:
    1. is the library configured as pickup location
    2. can a specific item / at least one of the items of a biblio be transferred
       into the library

OPTIONAL PARAMETERS:
    item   # Koha::Item object / itemnumber, find pickup locations for item
    biblio # Koha::Biblio object / biblionumber, find pickup locations for biblio

If no parameters are given, all libraries with pickup_location => 1 are returned.

=cut

sub pickup_locations {
    my ($self, $params) = @_;

    my $item = $params->{'item'};
    my $biblio = $params->{'biblio'};
    my $patron = $params->{'patron'};

    if ($biblio && $item) {
        Koha::Exceptions::BadParameter->throw(
            error => "Koha::Libraries->pickup_locations takes either 'biblio' or "
            ." 'item' as parameter, but not both."
        );
    }
    unless (! defined $patron || ref($patron) eq 'Koha::Patron') {
        $patron = Koha::Patrons->find($patron);
    }

    # Select libraries that are configured as pickup locations
    my $libraries = $self->search({
        pickup_location => 1
    }, {
        order_by => ['branchname']
    });

    return $libraries unless $item or $biblio;
    if($item) {
        unless (ref($item) eq 'Koha::Item') {
            $item = Koha::Items->find($item);
            return $libraries unless $item;
        }
        return $item->pickup_locations( {patron => $patron} );
    } else {
        unless (ref($biblio) eq 'Koha::Biblio') {
            $biblio = Koha::Biblios->find($biblio);
            return $libraries unless $biblio;
        }
        return $biblio->pickup_locations( {patron => $patron} );
    }
}

=head3 search_filtered

=cut

sub search_filtered {
    my ( $self, $params, $attributes ) = @_;

    my @branchcodes;
    my $userenv = C4::Context->userenv;
    if ( $userenv and $userenv->{number} ) {
        my $only_from_group = $params->{only_from_group};
        if ( $only_from_group ) {
            my $logged_in_user = Koha::Patrons->find( $userenv->{number} );
            my @branchcodes = $logged_in_user->libraries_where_can_see_patrons;
            $params->{branchcode} = { -in => \@branchcodes } if @branchcodes;
        } else {
            if ( C4::Context::only_my_library ) {
                $params->{branchcode} = C4::Context->userenv->{branch};
            }
        }
    }
    delete $params->{only_from_group};
    return $self->SUPER::search( $params, $attributes );
}

=head3 type

=cut

sub _type {
    return 'Branch';
}

sub object_class {
    return 'Koha::Library';
}

1;
