#!/usr/bin/perl

#use utf8;
use strict;
use CGI;
use JSON;
use Opals::Context;
use Opals::User qw( 
    user_getUserList
    );

use Digest::SHA qw(
    sha1_base64
    sha1_hex
);
use Opals::Session qw{
    SessionHdl_exist_rid
};


my $dbh = Opals::Context->dbh();
END { $dbh->disconnect(); }

#------------------------------------------------------------------------------------
my $fnMap={
        add=>{
            userGrpMod   =>\&userGrpMod_add,
        },
        addAll=>{
            userGrpMod=>\&userGrpMod_addAll,
            userGrpSearch=>\&userGrpMod_addAll

        },
        del=>{
            userGrpMod=>\&userGrpMod_del

        },
        clear=>{
            userGrpMod=>\&clear

        },
        getList=>{
            userGrpMod   =>\&userGrpMod_getList,
            userGrpSearch=>\&userGrpMod_getList

        },
        getCount=>{
            userGrpMod   =>\&userGrpMod_getCount,
            userGrpSearch=>\&userGrpMod_getCount
        }

    
    
    };


#------------------------------------------------------------------------------------
my $rs={};
my $request = _getRequest();
my $cgi = CGI->new;
my $ssId =_getSessionId();

if(defined $request){
    my $action=$request->{"action"};
    my $ssName=$request->{"ssName"};
    if(defined $fnMap->{$action} && $fnMap->{$action}->{$ssName}){
         $rs =$fnMap->{$action}->{$ssName}($dbh,$request);
    }
    else{
        $rs={status=>0};
    }

}
#------------------------------------------------------------------------------------
my $cookie = $cgi->cookie(
      -name    => "globalSessionID",
      -value   => $ssId);

print $cgi->header(
        -type    => 'text/plain',
        -cookie  => $cookie,
        -charset => 'utf-8'
    );

#------------------------------------------------------------------------------------
print  to_json($rs) ;


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

sub userGrpMod_add{
    my($dbh,$request)=@_;
    return _add($dbh,"userGrpMod",$request->{"uidList"});

}
######################################################################################
sub userGrpMod_addAll{
    my($dbh,$request)=@_;
    if($request->{"ssName"} eq 'userGrpSearch'){
        $dbh->do("delete from opl_sessionVar where ssid=? && var=?",undef,$ssId,"userGrpSearch");
    }
    my $rs =user_getUserList($dbh,$request->{"searchParam"},1);
    if($rs->{"numOfUserFound"}>0){
        foreach my $user(@{$rs->{"userList"}}){
            if(!SessionHdl_exist_rid($dbh,$ssId,$request->{"ssName"},$user->{"uid"})){
                $dbh->do("insert into opl_sessionVar set ssid='$ssId',var=?,rid=?",undef,$request->{"ssName"},$user->{"uid"});
            }
        }
    }
   
   return{status=>1,total=>_count($dbh,$request->{"ssName"})};

}
######################################################################################
sub userGrpMod_del{
    my($dbh,$request)=@_;
     return _del($dbh,"userGrpMod",$request->{"uidList"});
}
######################################################################################
sub userGrpMod_getList{
    my($dbh,$request)=@_;
    my $ssName =$request->{"ssName"};
    my $sth=$dbh->prepare("select rid from opl_sessionVar where  ssid=? && var=? orser by sOrder");
    $sth->execute($ssId,$ssName);
    my @uidList;
    while(my $u =$sth->fetchrow_hashref){
        push @uidList,$u->{'uid'};
    }
    return {userList=>\@uidList};
}
######################################################################################
sub userGrpMod_getCount{
    my($dbh,$request)=@_;
    my $ssName =$request->{"ssName"};
    my $sqlCount="select count(*) from opl_sessionVar where ssid=? && var=?";
   
    my ($c)=$dbh->selectrow_array($sqlCount, undef,$ssId,$ssName);
    return $c;
}
######################################################################################
sub clear{
    my($dbh,$request)=@_;
    my $ssName =$request->{"ssName"};
    my $sth=$dbh->prepare("delete from opl_sessionVar where  ssid=? && var=?");
    $sth->execute($ssId,$ssName);
    return{status=>1};



}
######################################################################################
sub _add{
    my($dbh,$ssName,$valList)=@_;

    my $sth_sel=$dbh->prepare("select count(*) from  opl_sessionVar where ssid=? and var=? and rid=?");
    my $sth=$dbh->prepare("insert into opl_sessionVar set ssid=?,var=?,rid=?");
    my $added=0;
    foreach my $v(@$valList){
        my ($cUid)=$dbh->selectrow_array($sth_sel, undef,$ssId,$ssName,$v);
        next if($cUid>0);
        $sth->execute($ssId,$ssName,$v);
        $added++;
    }
    my $c= _count($dbh,$ssName);
    return {status=>1,added=>$added,total=>$c};
}
######################################################################################
sub _del{
    my($dbh,$ssName,$valList)=@_;

    my $sth=$dbh->prepare("delete from opl_sessionVar where  ssid=? && var=? && rid=?");
    my $del=0;
    foreach my $v(@$valList){
        $sth->execute($ssId,$ssName,$v);
        $del++;
    }
    my $c= _count($dbh,$ssName);
    return {status=>1,deleted=>$del,total=>$c};
}
######################################################################################
sub _count{
    my($dbh,$ssName)=@_;
    my $sqlCount="select count(*) from opl_sessionVar where ssid=? && var=?";
    my ($c)=$dbh->selectrow_array($sqlCount, undef,$ssId,$ssName);
    return $c;
}


#------------------------------------------------------------------------------
sub _getRequest{
    my $request =undef;
    if ($ENV{'REQUEST_METHOD'} eq "POST") {
        my $json ="";
        while (<STDIN>) {
            $json .= $_;
        }
         $request = decode_json($json) if($json ne ""); 
    }
   
    return $request;
}
#------------------------------------------------------------------------------
sub _getSessionId{
   my $sessionID="";
   my $sessionID = $cgi->cookie('globalSessionID');
   if(!$sessionID){
        $sessionID = sha1_hex(time . rand(time));
   }
   return $sessionID; 
}


