#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use Opals::Context;
use POSIX;

use Date::Calc qw(Day_of_Week Week_Number Day_of_Year);

use Opals::Date qw(
    date_parse
    date_today
    date_text
    date_f005
);

use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_rangedPageList
);
use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);
use Opals::Mail qw(
    mail_getEmailByUid
    mail_getEmailByStatus
);
use Opals::User qw(
    user_getInformationById
);

    my $dbh = Opals::Context->dbh();
    my $cgi     = CGI->new;
    END { $dbh->disconnect(); }
   my ($permission, $cookie, $template) = tmpl_read(
        {
            dbh             => $dbh,
            cgi             => $cgi,
            tmplFile        => 'report/emailList.tmpl',
            reqPermission   => 'rpt_notice|rpt_circe',
        }
    );
$template->param(
        hlpUrl     => Opals::Constant->getHlpUrl("emailList")
   );

    my $input   = $cgi->Vars();
    my $op      = $input->{'op'};
    my $pagesize = 20;
    my $pNum = $input->{'pNum'};
    $pNum = 1 if ( !$pNum );

if ($permission && ($permission->{'rpt_notice'} 
                  ||$permission->{'rpt_circe'})) {

    my $sortBy  = $input->{'sortBy'};
    if(!defined $sortBy ||$sortBy eq ''){
        $sortBy="sendDate";
    }
    my $sortDir = $input->{'sortDir'};

    if (!$sortDir || $sortDir eq '' ){
        $sortDir =($sortBy eq 'sendDate')? 'desc':'asc';
    }

    if($sortBy eq "firstname" || $sortBy eq "lastname" || 
            $sortBy eq "grade" ) { 
        $sortBy = "u." .$sortBy ; 
    }
    elsif ( $sortBy eq "requestDate" || $sortBy eq "sendDate" || 
            $sortBy eq "retryCount" || $sortBy eq "status") { 
        $sortBy = "r." .$sortBy ; 
    }
    elsif ( $sortBy eq "subject"  ) { 
        $sortBy = "d." .$sortBy ; 
    }

    my $uList   = $input->{'uList'};
    my $filterBy= $input->{'filterBy'};
    my $uInfo; 
    if(defined $op && $op eq 'resend' ){
      
        my $eidList =  $input->{'emaillist'};
        $eidList =~ s/\$+/,/g;
        $eidList =~ s/,$//g;    

        $dbh->do("update opl_emailRequest set status ='waiting' , retryCount =0 where eid in ($eidList) ");
    }

    if(defined $op && $op eq 'userNoEmail' ){ 
        my ($userInfo, $guardian);
        my @uArr = split /,/, $uList;
        my $nUser = scalar(@uArr);

        for(my $i=0; $i<$nUser; $i++) {
             ($userInfo, $guardian) = user_getInformationById($dbh, $uArr[$i]);
             #push @$uInfo,{user=>$userInfo,guardian=>$guardian};
             if($userInfo->{'uid'} && $userInfo->{'firstname'} && 
                $userInfo->{'lastname'}   ){
                if($userInfo->{'status'} eq 'rejected'){
                    $userInfo->{'status'} = 'Error. Invalid email address';
                }
                push @$uInfo,$userInfo;
             }
        }
    }
    else{
        if(defined $uList && $uList ne ''){
            $uInfo =mail_getEmailByUid($dbh,$uList,$sortBy,$sortDir,$pNum,$pagesize);
        }
        else{

            $uInfo =mail_getEmailByStatus($dbh,$filterBy,$sortBy,$sortDir,$pNum,$pagesize);
        }
    }
    my ($waitCount,$sentCount,$rejtCount,$totalCount) = (0,0,0,0);
    foreach my $u(@$uInfo){
        if($u->{'status'} eq 'Error. Invalid email address') { #case rejected
            $rejtCount++;
        }
        elsif($u->{'status'} eq 'sent'){
            $sentCount++;
        }
        elsif($u->{'status'} eq 'waiting'){
            $waitCount++;
        }
        $u->{'eBarcodes'}   =~ s/,/, /g;
    }
    $totalCount = scalar (@$uInfo);
    $template->param(resend    => 1) if($totalCount == $rejtCount + $sentCount);
    
    MakePages($dbh,$uList,$filterBy,$pNum,$pagesize);

    $template->param(userNoEmail=> (defined $op && $op eq 'userNoEmail') ? 1:0, 
                     uInfo      => $uInfo,
                     uList      => $uList,
                     filterBy   => $filterBy,
                     "$filterBy" =>1,
                     sortBy     => $sortBy,
                     sortDir    => $sortDir,
                     rejtCount  =>$rejtCount,
                     sentCount  =>$sentCount,
                     pNum       =>$pNum,
                     );


    my $itemOnLoanMsgMap =loc_getMsgFile('circ/notice.msg');
    loc_write($template,$itemOnLoanMsgMap);
}    
#----------------------------------------------------------
sub MakePages
{
    my ($dbh,$uList,$status,$pNum,$pagesize) = @_;
    my $sql = <<_STH_;
select  count(distinct r.eid)
from    opl_emailRequest r inner join opl_emailDetails d using(eid) 
        inner join opl_user u on u.uid=r.uid      
_STH_
 
 my $condStr="";
    if(defined $uList && $uList ne '' ){
        $condStr .= " r.uid in ($uList) ";
    }
    if(defined $status && $status ne '' && $status ne 'all'  ){
        if($condStr ne ''){
            $condStr .= ' && ';
        }
        $condStr .= "  r.status = '$status' ";
    }
    if(defined $condStr && $condStr ne '' ){
        $sql .= "where $condStr ";
    }

    my $sth = $dbh->prepare($sql);
    $sth->execute();
   my ($countReq) = $sth->fetchrow_array;

 my @rangedPageList = tmpl_rangedPageList($countReq, $pNum, $pagesize, 10);
    $template->param(
        countReq        => $countReq,
        rangedPageList  => \@rangedPageList,
    );

}



tmpl_write($dbh, $cgi, $cookie, $template);


