#!/usr/bin/perl
package Eq_RecordFn;
#use utf8;
use strict;
use Opals::REST;
use Opals::Context;
our @ISA =qw(Opals::REST);
use POSIX qw (strftime);

use Time::localtime;

use Opals::Constant;
use Opals::Template qw(
    tmpl_preference
);

use Opals::Date qw(
    date_parse
    dateTime_parse
    date_deltaWorkDayHour
    date_now
);
use Opals::Eq_Record qw(
    eq_record_getInfo
    eq_record_saveMasterRecord
    eq_record_saveItem
    eq_record_idGen
    eq_record_nextBarcode
);
use Opals::Equipment qw(
    eq_dbInfo
    eq_getAccessoryList
);

use Opals::Eq_SolrIndex;
#use Opals::Eq_SolrIndexer;

use JSON;
my $dbh = Opals::Context->dbh();
my $db_name = Opals::Context->config('db_name');
END { $dbh->disconnect(); }

my $RECORD_FUNCTION_MAP={
    get         =>\&get,
    save        =>\&save,
    delete      =>\&delete,
    getItemAccs =>\&getItemAccs,
    getItemAcqst=>\&getItemAcqst,
    saveAccs    =>\&saveAccs,
    updateAccs  =>\&updateAccs,
    cleanEQ     =>\&cleanEQ,
    reIndexer   =>\&reIndexer,
};

my $eq_solr = Opals::Eq_SolrIndex->new(dbh=>$dbh);
#my $eq_solr = Opals::Eq_SolrIndexer->new(dbh=>$dbh);

my $recordFn = Eq_RecordFn->new($dbh,$RECORD_FUNCTION_MAP);
my $todayStr = date_now() ;
my $loginUser = $recordFn->{'authInfo'}->{'user'};
my $respUid = $loginUser->{'uid'};

my $ITEM_STATUS_MAP={
     0    =>   "ITEM_INACTIVE"           ,
     1    =>   "ITEM_ACTIVE"             ,
     2    =>   "ITEM_DAMAGED"            ,
     3    =>   "ITEM_LOST"               ,
     5    =>   "ITEM_DELETED"            ,
     6    =>   "ITEM_NEW"                ,
     7    =>   "ITEM_PURGED"             ,
     8    =>   "ITEM_ON_ORDER"           ,
     9    =>   "ITEM_IN_PROCESSING"      ,
     10   =>   "ITEM_IN_REPAIR"          ,
     11   =>   "ITEM_CLAIM_RETURN"       ,
     12   =>   "ITEM_CLAIM_NEVER_LOAN"   ,
     13   =>   "ITEM_WEED"               
};

$recordFn->processRequest();
##-------------------------------------------------------------------------------------------
#
sub get {
	my ($dbh,$param)=@_;
}

sub save {
	my($dbh,$p)=@_;
  open debug, ">/tmp/R";
  print debug "param", to_json($p), "\n";
  my $type=$p->{'type'};
  my $data=$p->{'data'};
  if ($type eq 'record'){
    print debug "save record :",to_json($data) ,"\n";
    if (!$data->{'rid'}){
      $data->{'newRecord'}=1;
      $data->{'rid'}= eq_record_idGen($dbh);
    }
    eq_record_saveMasterRecord($dbh,$data);
  }
  elsif ($type eq 'item'){
    print debug "data from save item: \n", to_json($data,{pretty=>1}), "\n";
    #eq_record_saveItem($dbh,$data);
    my $startBarcode = $data->{'startBarcode'};
    my $nItems  = $data->{'nOfItems'}||0;
    print debug "nItems:$nItems\n";
    my $barcode="";
    if ($nItems<=0){
      $data->{'newItem'}=1;
      print debug "save this: ", to_json($data,{pretty=>1}),"\n";
      eq_record_saveItem($dbh,$data);
    }
    else{
      for (my $i=0; $i<$nItems;$i++) {
        if ($i<1){
            $barcode = $startBarcode;
        }
        else {
            $barcode = eq_record_nextBarcode($barcode);
        }
        $data->{'barcode'}=$barcode;
        $data->{'newItem'}=1;
        print debug "save barcode:$barcode \n", to_json($data,{pretty=>1}), "\n";
        eq_record_saveItem($dbh,$data);
      }
    }
  }
  else{
    print debug "undef type \n";
  }

  my $recordInfo = Opals::Eq_Record::eq_record_getInfo($dbh,{'rid'=>$data->{'rid'},'format'=>'brief','circInfo'=>1});
  close debug;
  return {status=>1,msg=>'save',param=>$p,recordInfo=>$recordInfo};
}

sub delete {

  my ($dbh,$param)=@_;

  return {status=>0};
}

sub saveAccs {
  my ($dbh,$param)=@_;
  my $list = $param->{'list'};
  my $retMsg;
  $dbh->do("truncate table eq_accsMgmt;");
  my $sql = "insert into eq_accsMgmt set typeId=?,accessory=?";
  my $sth = $dbh->prepare($sql);
  foreach my $l (@{$list}) {
    my $typeId=$l->{'typeId'};
    my $acc = $l->{'name'};
    push @$retMsg,$sth->execute($typeId,$acc);
  }
  $sth->finish;
  _updateItemAccessory($dbh);
  return {status=>1,msg=>'saveAccs',ret=>$retMsg};
}

sub _updateItemAccessory {
  my ($dbh)=@_;
  $dbh->do("truncate table eq_itemAccessory");
  my $sql="insert into eq_itemAccessory (barcode,accessory,ondate,status) select barcode,accessory,now(),1 from eq_items i inner join eq_accsMgmt a using(typeId) where i.deleted='0' && i.barcode not regexp '^___' order by barcode";
  $dbh->do($sql);
}

sub cleanEQ {
	my ($dbh,$param)=@_;
  my $d = `date "+%Y%m%d"` ;
  #my $ddd =  date_now();
  my @tables = ("eq_records","eq_recordFields","eq_items","eq_itemFields","eq_loan","eq_itemStatus","eq_cvsImport","eq_cvsDuplicate","eq_consumableMgmt");
  if ($param->{'cleanCategory'} && $param->{'cleanCategory'} eq '1'){
    push @tables,'eq_category';
  }
  if ($param->{'cleanImportInfo'} && $param->{'cleanImportInfo'} eq '1'){
    push @tables,'eq_csvImport';
    push @tables,'eq_csvDuplicate';
  }
  foreach my $tbl (@tables){
    $dbh->do("truncate table $tbl");
  }
  $dbh->do("delete * from opl_idGen where type='equipment'");
  my $c = $dbh->selectrow_array("select count(*) from opl_idGen");
  if ($c && $c>0){
    $dbh->do("create table opl_idGen_$d select * from opl_idGen");
    $dbh->do("truncate table opl_idGen");
    $dbh->do("insert into opl_idGen select * from opl_idGen_$d where type='textbook'");
  }
  reIndexer();
	return {status=>1, msg=>'cleanEQ' } ;
}

sub updateAccs {
  my ($dbh,$p)=@_;
  my $item = $p->{'item'};
  my $curAccsList = $item->{'curAccessoryList'} || [];
  my $accsList = $item->{'accessoryList'} || [];;
  my $retMsg;
  my $status=1;
  my $aStatus=0;
  open debug,">/tmp/A";
  print debug "item:", to_json($item),"\n";
  print debug "curAccsList:", to_json($curAccsList), "\n";
  print debug "AccsList:", to_json($accsList) ,"\n";
  foreach my $a(@$curAccsList){
    if (!grep /^$a$/,@$accsList ){
      print debug "remove $a \n";
      print debug "update eq_itemAccessory set status=0 where barcode=$item->{'barcode'} && status=1 && accessory='$a' \n";
      $aStatus= $dbh->do("update eq_itemAccessory set status=0 where barcode=? && status=1 && accessory=?",undef,$item->{'barcode'},$a);
      $retMsg = "remove $a to $item->{'barcode'} :  $aStatus";
    }
  }
  foreach my $a(@$accsList){
    if (!grep /^$a$/,@$curAccsList ){
      print debug "add $a \n";
      print debug "insert into eq_itemAccessory (barcode,accessory,ondate,status) values ($item->{'barcode'},$a,now(),1) \n";
      $aStatus= $dbh->do("insert into eq_itemAccessory (barcode,accessory,ondate,status) values (?,?,now(),?) on duplicate key update status=1",undef, $item->{'barcode'},$a,1);
      $retMsg = "insert $a to $item->{'barcode'} :  $aStatus";
    }
  }
  my $item= eq_getAccessoryList($dbh,{barcode=>$item->{'barcode'}});
  if ($aStatus==undef){
    $status=0;
  }
  close debug;
  return {status=>$status,msg=>'updateAccs',ret=>$retMsg,item=>$item};
}

sub getItemAccs{
  my ($dbh,$p)=@_;
  my $barcode=$p->{'barcode'};
  my $item= eq_getAccessoryList($dbh,{barcode=>$barcode});
  return $item;
}
sub getItemAcqst{
  my ($dbh,$p)=@_;
  my $item= eq_getAccessoryList($dbh,{barcode=>$p->{'barcode'}});
  return $item;
}

sub reIndexer {
  $eq_solr->eq_slr_index_clean();
  $eq_solr->eq_slr_updateIndex();
  
  #$eq_solr->eq_solrIndex_clear();
  #$eq_solr->eq_solrIndex_update();
  
  return eq_dbInfo($dbh);
}

