package Opals::Eq_GlobalEditor;
# Version number
$VERSION   = 0.01;      

#use utf8;
use strict;
use Encode;
use LWP::UserAgent;
use HTTP::Request::Common;
use Time::localtime;
use Opals::Eq_SolrIndex;

my $tm = localtime;
my $dateToday = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $tm->year+1900, ($tm->mon)+1, $tm->mday, $tm->hour, $tm->min, $tm->sec);


sub new {

    my $class = shift;
    my (%param) = (@_);
    my $dbh = $param{'dbh'};
    return unless $dbh;
    my $this = {
        dbh => $dbh,
    };
    bless $this, $class;
    return $this;
}


sub eq_ge_process {
    
    my $this = shift;
    my $dbh = $this->{'dbh'};

    my $sth = $dbh->prepare(<<_SQL_);
select * 
from    eq_geRequest 
where   status in ('waiting','processing') order by req_id
_SQL_

    my $sth_rid = $dbh->prepare(<<_SQL_);
select * 
from    eq_geRecord
where req_id = ? && status='waiting'
_SQL_
   
    my $sth_rid_cnt = $dbh->prepare(<<_SQL_);
select  count(distinct rid) as count 
from    eq_geRecord
where   req_id= ? && status='waiting'    
_SQL_
    my $sth_start = $dbh->prepare(<<_SQL_);
update  eq_geRequest
set     status = 'processing'
where   req_id = ?
_SQL_

    my $sth_finish = $dbh->prepare(<<_SQL_);
update  eq_geRequest
set     status = 'done', finishDate=now()
where   req_id = ?
_SQL_

    $sth->execute();
    my ($req_id,$action,$ridNum,$ridDone);
    while (my $request = $sth->fetchrow_hashref){
        print "Request id ", $request->{'req_id'} , ":";
        $req_id = $request->{'req_id'};
        $action = $request->{'action'};
        my $record;
        $sth_start->execute($req_id);
        $sth_rid->execute($req_id);
        $sth_rid_cnt->execute($req_id);
        ($ridNum) = $sth_rid_cnt->fetchrow_array;
        print "ridNum : $ridNum";
        $ridDone=0;
        while (my $rec = $sth_rid->fetchrow_hashref){
            push @{$record->{$rec->{'rid'}}};
        }
        foreach my $rid(keys %{$record}){
            if ($action eq "update"){
                $this->ge_doUpdate($request,$rid);
            }
            elsif ($action eq "changeRecType"){
                print "change item type \n";
                $this->ge_doChangeRecType($request,$rid);
            }
            elsif ($action eq "changeCategory"){
                print "change Record Category \n";
                $this->ge_doChangeCategory($request,$rid);
            }
            $dbh->do("update eq_records set indexed='0',modifiedDate=now() where rid=$rid ");
            $ridDone++;
        }
        print "ridDone: $ridDone ";

        if ($ridDone == $ridNum){
            print "here done...";
            $sth_finish->execute($req_id);
        }
        print "\n";
    }
    my $eq_solr = Opals::Eq_SolrIndex->new(dbh=>$dbh);
    $eq_solr->eq_slr_updateIndex();
}


sub ge_doUpdate {
    
    my $this = shift;
    my $dbh = $this->{'dbh'};
    my ($request,$rid) = @_;
    print "\n will update record " , $rid;
    print "\n";
    my $defType ;
    my $fields = def_getList($dbh);


    while (my ($k,$v) = each %{$request}){
        print "$k=>$v \t";
    }
    if ($fields->{$request->{'o_code'}}){
        $defType = $fields->{$request->{'o_code'}}->{'defType'};
        print "type: $defType \t";
        if ($defType eq "record"){
            print " for this field " , $request->{'o_code'} , "=>" , $fields->{$request->{'o_code'}}->{'name'} . " in record" ;
            $this->ge_updateRecordField($request,$rid);
        }
        elsif ($defType eq "item"){
            print " for this field " , $request->{'o_code'} , "=>" , $fields->{$request->{'o_code'}}->{'name'} . " in item" ;
            $this->ge_updateItemField($request,$rid);
        }
    }
    #$dbh->do("update eq_records set indexed='0',modifiedDate=now() where rid=$rid ");
    print " from this value [$request->{'o_data'}] to this value [$request->{'n_data'}] \t";

}



sub  ge_updateRecordField {

    my $this = shift;
    my $dbh = $this->{'dbh'};
    my ($request,$rid) = @_;
    my $o_data = $request->{'o_data'};
    my $n_data = $request->{'n_data'};
    print "o_data : $o_data \t n_data: $n_data \n";
    my $sth_status = $dbh->prepare(<<_SQL_);
update  eq_geRecord 
set     status='done'    
where   req_id =? && rid=?
_SQL_
    
    my $sqlRecord = "select rname from eq_records where rid=$rid";
    my $sqlUpdateName = "update eq_records set rname= replace(rname,?,?) where rid=$rid";
    my $sqlUpdateRecField = "update eq_recordFields set fValue= ? where rid=$rid && fId=?";
    my $sqlReplaceRecField = "update eq_recordFields set fValue=replace(fValue, ?,?) where rid=$rid && fId=?";
    my $sqlRecordFields = "select fValue from eq_recordFields where rid=$rid && fId=?";
    my $sth;
    print " \n process update rid: $rid \n " ;
    if ($request->{'o_code'} =~ /eq_name/) {
        my $rname = $dbh->selectrow_array($sqlRecord);
        if ($rname){
            $sth = $dbh->prepare($sqlUpdateName);
            $sth->execute($o_data,$n_data);
        }
    }
    else{
        my $fValue = $dbh->selectrow_array($sqlRecordFields);
        print "o_code: $request->{'o_code'} \n";
        print "fValue :$fValue \n";
        if ($o_data && $o_data ne ""){
            $sth = $dbh->prepare($sqlReplaceRecField);
            $sth->execute($o_data,$n_data,$request->{'o_code'} );
        }   
        else{
            $sth = $dbh->prepare($sqlUpdateRecField);
            $sth->execute($n_data,$request->{'o_code'} );
        }
    }
    print debug "req_id: $request->{'req_id'} $rid \n";
    $sth_status->execute($request->{'req_id'},$rid);
    $sth->finish;
}

sub  ge_updateItemField {

    my $this = shift;
    my $dbh = $this->{'dbh'};
    my ($request,$rid) = @_;
    
    my $o_data = $request->{'o_data'};
    my $n_data = $request->{'n_data'};
    my $req_id = $request->{'req_id'};
    my $sth;
    print "updateItemFields....\n";
    while ( my ($k,$v) = each %{$request}){
        print "*** $k=>$v \n";
    }
    my $sth_status = $dbh->prepare(<<_SQL_);
update  eq_geRecord 
set     status='done'    
where   req_id =? && rid=?
_SQL_

    my $sqlUpdateItmField = "update eq_itemFields set sfValue= ? where rid=$rid && sfId=?";
    my $sqlReplaceItmField = "update eq_itemFields set sfValue=replace(sfValue, ?,?) where rid=$rid && sfId=?";
    my $nUpdate = 0;
    if ($o_data && $o_data ne ""){
            $sth = $dbh->prepare($sqlReplaceItmField);
            $sth->execute($o_data,$n_data,$request->{'o_code'} );
            $nUpdate = $sth->rows;
            #$dbh->do("update eq_geRecord set barcode=$nUpdate where rid=$rid && req_id=$req_id");
    }   
    else{
        $sth = $dbh->prepare($sqlUpdateItmField);
        $sth->execute($n_data,$request->{'o_code'} );
        print "rows affected :" , $sth->rows , "\n";
        $nUpdate = $sth->rows;
        $dbh->do("update eq_geRecord set barcode=$nUpdate where rid=$rid && req_id=$req_id");
    }
    if ($nUpdate && $nUpdate > 0){
         $dbh->do("update eq_items set modifiedDate=now() where rid=$rid");
    }
    $sth_status->execute($request->{'req_id'},$rid);
    $sth->finish;
    $sth_status->finish;
}



sub ge_doChangeCategory {
    
    my $this = shift;
    my $dbh = $this->{'dbh'};
    my ($request,$rid) = @_;

    my $n_data = $request->{'n_data'};
    my $req_id = $request->{'req_id'};
    my $sqlUpdate = "update eq_records set category=? where rid=$rid";
    my $sth_status = $dbh->prepare(<<_SQL_);
update  eq_geRecord 
set     status='done'    
where   req_id =? && rid=?
_SQL_

    my $sth = $dbh->prepare($sqlUpdate);
    my $nUpdate = 0;
    if ($request->{'n_data'} && $request->{'n_data'} ne ""){
        $sth->execute($n_data);
        $nUpdate = $sth->rows;
    }
    $sth_status->execute($request->{'req_id'},$rid);
    $sth->finish;
    $sth_status->finish;

}

sub ge_doChangeRecType {
    
    my $this = shift;
    my $dbh = $this->{'dbh'};
    my ($request,$rid) = @_;
    my $n_data = $request->{'n_data'};
    my $req_id = $request->{'req_id'};
    my $sqlUpdate = "update eq_items set typeId=?, modifiedDate=now() where rid=$rid";
    my $sth_status = $dbh->prepare(<<_SQL_);
update  eq_geRecord 
set     status='done'    
where   req_id =? && rid=?
_SQL_
    my $sth = $dbh->prepare($sqlUpdate);
    my $nUpdate = 0;
    if ($request->{'n_data'} && $request->{'n_data'} ne ""){
        $sth->execute($n_data);
        $nUpdate = $sth->rows;
        $dbh->do("update eq_geRecord set barcode=$nUpdate where rid=$rid && req_id=$req_id");
    }
    $sth_status->execute($request->{'req_id'},$rid);
    $sth->finish;
    $sth_status->finish;

}

sub def_getList{

    my ($dbh) = @_;
    my @list = ();
    my $sql = "select id,defType,name from eq_def order by defType,name";
    my $sth = $dbh->prepare($sql);
    $sth->execute();
    my $ret;
    $ret->{'eq_name'} = {'id'=>'eq_name','name'=>'Equipment Name','defType'=>'record'};
    while (my $d = $sth->fetchrow_hashref){
        #push @list,$d;
        if (!$ret->{$d->{'id'}}){
            $ret->{$d->{'id'}}->{'id'} = $d->{'id'};
            $ret->{$d->{'id'}}->{'name'} = $d->{'name'};
            $ret->{$d->{'id'}}->{'defType'} = $d->{'defType'};
        }
    }
    $sth->finish;
    return $ret;
}


1;

################################################################################



