#!/usr/bin/perl

# Copyright 2000-2002 Katipo Communications
#
# 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 2 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., 59 Temple Place,
# Suite 330, Boston, MA  02111-1307 USA


=head1 NAME

serials-recieve.pl

=head1 Parameters

=over 4

=item op
op can be :
    * modsubscriptionhistory :to modify the subscription history
    * serialchangestatus     :to modify the status of this subscription

=item subscriptionid

=item user

=item histstartdate

=item enddate

=item recievedlist

=item missinglist

=item opacnote

=item librariannote

=item serialid

=item serialseq

=item planneddate

=item notes

=item status

=back

=cut


use strict;
use warnings;
use CGI;
use C4::Auth;
use C4::Dates qw/format_date format_date_in_iso/;
use C4::Biblio;
use C4::Items;
use C4::Koha;
use C4::Output;
use C4::Context;
use C4::Serials;

#use Smart::Comments;

my $query = new CGI;
my $dbh = C4::Context->dbh;
my @serialids = $query->param('serialid');
my @serialseqs = $query->param('serialseq');
my @planneddates = $query->param('planneddate');
my @publisheddates = $query->param('publisheddate');
my @status = $query->param('status');
my @notes = $query->param('notes');
my @subscriptionids = $query->param('subscriptionid');
my $op = $query->param('op');
if (scalar(@subscriptionids)==1 && index($subscriptionids[0],",")>0){
  @subscriptionids =split (/,/,$subscriptionids[0]);
}
my @errors;
my @errseq;
# If user comes from subscription details
unless (@serialids){
  foreach my $subscriptionid (@subscriptionids){
    my $serstatus=$query->param('serstatus');
    if ($serstatus){
      my ($count,@tmpser)=GetSerials2($subscriptionid,$serstatus);
      foreach (@tmpser) {
        push @serialids, $_->{'serialid'};
      }
    }
  }
}

unless (scalar(@serialids)){
  my $string="serials-collection.pl?subscriptionid=".join(",",@subscriptionids);
  $string=~s/,$//;
#  warn $string;
  print $query->redirect($string);
}
my ($template, $loggedinuser, $cookie)
= get_template_and_user({template_name => "serials/serials-edit.tmpl",
                query => $query,
                type => "intranet",
                authnotrequired => 0,
                flagsrequired => {serials => 1},
                debug => 1,
                });

my @serialdatalist;
my %processedserialid;
foreach my $tmpserialid (@serialids){
    #filtering serialid for duplication
    #NEW serial should appear only once and are created afterwards
    next unless (defined($tmpserialid) && $tmpserialid =~/^[0-9]+$/ && !$processedserialid{$tmpserialid});
    my $data=GetSerialInformation($tmpserialid);
    $data->{publisheddate}=format_date($data->{publisheddate});
    $data->{planneddate}=format_date($data->{planneddate});
    $data->{'editdisable'}=((HasSubscriptionExpired($data->{subscriptionid})&& $data->{'status1'})||$data->{'cannotedit'});
    push @serialdatalist,$data;
    $processedserialid{$tmpserialid}=1;
}
my $bibdata=GetBiblioData($serialdatalist[0]->{'biblionumber'});

my @newserialloop;
my @subscriptionloop;
# check, for each subscription edited, that we have an empty item line if applicable for the subscription
my %processedsubscriptionid;
foreach my $subscriptionid (@subscriptionids){
    #Donot process subscriptionid twice if it was already processed.
    my $subscriptiondetail = GetSubscription($subscriptionid);
    next unless (defined($subscriptionid) && !$processedsubscriptionid{$subscriptionid});
    my $cell;
    if ($serialdatalist[0]->{'serialsadditems'}){
    #Create New empty item
        $cell =
        PrepareItemrecordDisplay( $serialdatalist[0]->{'biblionumber'},'', $subscriptiondetail);
        $cell->{serialsadditems} = 1;
    }
    $cell->{'subscriptionid'}=$subscriptionid;
    $cell->{'itemid'}       = "NNEW";
    $cell->{'serialid'}     = "NEW";
    $cell->{'issuesatonce'}   = 1;
    push @newserialloop,$cell;
    push @subscriptionloop, {'subscriptionid'=>$subscriptionid,
                            'abouttoexpire'=>abouttoexpire($subscriptionid),
                            'subscriptionexpired'=>HasSubscriptionExpired($subscriptionid),
    };
    $processedsubscriptionid{$subscriptionid}=1;
    $template->param(bibliotitle  => $subscriptiondetail->{'bibliotitle'},
                        callnumber => $subscriptiondetail->{'callnumber'},
                );

}
$template->param(newserialloop=>\@newserialloop);
$template->param(subscriptions=>\@subscriptionloop);

if ($op and $op eq 'serialchangestatus') {
#     my $sth = $dbh->prepare("select status from serial where serialid=?");
    my $newserial;
    for (my $i=0;$i<=$#serialids;$i++) {
#         $sth->execute($serialids[$i]);
#         my ($oldstatus) = $sth->fetchrow;
        if ($serialids[$i] && $serialids[$i] eq "NEW") {
          if ($serialseqs[$i]){
            #IF newserial was provided a name Then we have to create a newSerial
            ### FIXME if NewIssue is modified to use subscription biblionumber, then biblionumber would not be useful.
            $newserial = NewIssue( $serialseqs[$i],$subscriptionids[$i],$serialdatalist[0]->{'biblionumber'},
                      $status[$i],
                      format_date_in_iso($planneddates[$i]),
                      format_date_in_iso($publisheddates[$i]),
                      $notes[$i]);
          }
        }elsif ($serialids[$i]){
            ModSerialStatus($serialids[$i],
                            $serialseqs[$i],
                            format_date_in_iso($planneddates[$i]),
                            format_date_in_iso($publisheddates[$i]),
                            $status[$i],
                            $notes[$i]);
        }
    }
    my @moditems = $query->param('moditem');
    if (scalar(@moditems)){
      my @tags = $query->param('tag');
      my @subfields = $query->param('subfield');
      my @field_values = $query->param('field_value');
      my @serials = $query->param('serial');
      my @bibnums = $query->param('bibnum');
      my @itemid = $query->param('itemid');
      my @ind_tag = $query->param('ind_tag');
      my @indicator = $query->param('indicator');
      #Rebuilding ALL the data for items into a hash
      # parting them on $itemid.
      my %itemhash;
      my $countdistinct;
      my $range=scalar(@itemid);
      for (my $i=0; $i<$range; $i++){
        unless ($itemhash{$itemid[$i]}){
          if ($serials[$countdistinct] && $serials[$countdistinct] ne "NEW"){
            $itemhash{$itemid[$i]}->{'serial'}=$serials[$countdistinct];
          } else {
            $itemhash{$itemid[$i]}->{'serial'}=$newserial;
          }
          $itemhash{$itemid[$i]}->{'bibnum'}=$bibnums[$countdistinct];
          $countdistinct++;
        }
        push @{$itemhash{$itemid[$i]}->{'tags'}},$tags[$i];
        push @{$itemhash{$itemid[$i]}->{'subfields'}},$subfields[$i];
        push @{$itemhash{$itemid[$i]}->{'field_values'}},$field_values[$i];
        push @{$itemhash{$itemid[$i]}->{'ind_tag'}},$ind_tag[$i];
        push @{$itemhash{$itemid[$i]}->{'indicator'}},$indicator[$i];
      }
      foreach my $item (keys %itemhash){
        # Verify Itemization is "Valid", i.e. serial status is Arrived or Missing
        my $index=-1;
        for (my $i=0; $i<scalar(@serialids);$i++){
          $index = $i if ($itemhash{$item}->{'serial'} eq $serialids[$i] || ($itemhash{$item}->{'serial'} == $newserial && $serialids[$i] eq "NEW"));
        }
        if ($index>=0 && $status[$index]==2){
          my $xml = TransformHtmlToXml( $itemhash{$item}->{'tags'},
                                  $itemhash{$item}->{'subfields'},
                                  $itemhash{$item}->{'field_values'},
                                  $itemhash{$item}->{'ind_tag'},
                                  $itemhash{$item}->{'indicator'});
  #           warn $xml;
          my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
          if ($item=~/^N/){
            #New Item
			
            # if autoBarcode is set to 'incremental', calculate barcode...
            my ($barcodetagfield,$barcodetagsubfield) = &GetMarcFromKohaField("items.barcode", GetFrameworkCode($serialdatalist[0]->{'biblionumber'}));
            if (C4::Context->preference("autoBarcode") eq 'incremental'  ) {
              if (!$record->field($barcodetagfield)->subfield($barcodetagsubfield)) {
                my $sth_barcode = $dbh->prepare("select max(abs(barcode)) from items");
                $sth_barcode->execute;
                my ($newbarcode) = $sth_barcode->fetchrow;
                # OK, we have the new barcode, add the entry in MARC record # FIXME -> should be  using barcode plugin here.
                $record->field($barcodetagfield)->update( $barcodetagsubfield => ++$newbarcode );
              }
            }
            # check for item barcode # being unique
            my $exists;
            if ($record->subfield($barcodetagfield,$barcodetagsubfield)) {
                $exists = GetItemnumberFromBarcode($record->subfield($barcodetagfield,$barcodetagsubfield));
            }
            #           push @errors,"barcode_not_unique" if($exists);
            # if barcode exists, don't create, but report The problem.
            if ($exists){
                push @errors,"barcode_not_unique" if($exists);
                push @errseq,{"serialseq"=>$serialseqs[$index]};
            } else {
                my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$itemhash{$item}->{'bibnum'});
                AddItem2Serial($itemhash{$item}->{'serial'},$itemnumber);
            }
          } else {
            #modify item
            my ($oldbiblionumber,$oldbibnum,$itemnumber) = ModItemFromMarc($record,$itemhash{$item}->{'bibnum'},$item);
          }
        }
      }
    }
#     ### FIXME this part of code is not very pretty. Nor is it very efficient... There MUST be a more perlish way to write it. But it works.
#     my $redirect ="serials-home.pl?";
#     $redirect.=join("&",map{"serialseq=".$_} @serialseqs);
#     $redirect.="&".join("&",map{"planneddate=".$_} @planneddates);
#     $redirect.="&".join("&",map{"publisheddate=".$_} @publisheddates);
#     $redirect.="&".join("&",map{"status=".$_} @status);
#     $redirect.="&".join("&",map{"notes=".$_} @notes);

   if (scalar(@errors)>0){
        $template->param("Errors" => 1);
        if (scalar(@errseq)>0){
            $template->param("barcode_not_unique" => 1);
            $template->param('errseq'=>\@errseq);
        }
   } else {
        my $redirect ="serials-collection.pl?";
        my %hashsubscription;
	      foreach (@subscriptionids) {
            $hashsubscription{$_}=1;
	      }
        $redirect.=join("&",map{"subscriptionid=".$_} sort keys %hashsubscription);
        print $query->redirect("$redirect");
   }
}

$template->param(
    serialsadditems => $serialdatalist[0]->{'serialsadditems'},
    biblionumber => $serialdatalist[0]->{'biblionumber'},
    serialslist  => \@serialdatalist,
);
output_html_with_http_headers $query, $cookie, $template->output;
