#!/usr/bin/perl

#use utf8;
use strict;
use CGI;
use Digest::SHA qw(
    sha512_hex
);


use Opals::Context;
use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_rangedPageList
    tmpl_preference

);
use Opals::Constant;
use Opals::Utility qw(
    util_resizeImg
);

use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);

my $mimeType={
        'jpg'       => 'image/jpeg',
        'gif'       => 'image/gif',
        'jpeg'      => 'image/jpeg',
        'png'       => 'image/png'
};




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

my $cgi = CGI->new;
my $input = $cgi->Vars();
my $syspref = tmpl_preference($dbh);
my ($permission, $cookie, $template) = tmpl_read(
    {
        dbh             => $dbh,
        cgi             => $cgi,
        tmplFile        => 'user/userImgImport.tmpl',
        reqPermission   => 'user_add',
    }
);

my $fname     = $input->{'imgFile'};

my $fNameStructure = $input->{'fNameStructure'};

# CONSTANTS
use constant {
    BC            =>1,
    LASTCOMMAFIRST=>2,
    LASTSPACEFIRST=>3,
    FIRSTSPACELAST=>4,
    SID           =>5
};
my ($totalImg,$totalImported)=(0,0);

if ($permission && $permission->{'user_add'} && $fname ne '') {
    #------------------- upload file  ----------------------
    my $db_name = Opals::Context->config('db_name');
    my $imex    = Opals::Context->config('imex');
    umask 002;
         
    my $dir=`/bin/mktemp -d `;
    $dir =~ s/\n$//gi;
    system("chown apache.apache $dir");
    my $upload_filehandle = $cgi->upload("imgFile"); 
    open    UPLOADFILE, ">$dir/$fname" ;
    binmode UPLOADFILE;
    while ( <$upload_filehandle> ){
        print UPLOADFILE;
    }
    close UPLOADFILE;
    
    #--------------------  unzip file ------------------------
    system("unzip '$dir/$fname' -d '$dir'");
    system("rm '$dir/$fname' ");

    extactImg2Db($dbh,$dir);
}
$template->param(hlpUrl     => Opals::Constant->getHlpUrl('userImgImport') );

$template->param(
   BC            =>BC            ,
   SID           =>SID            ,
   LASTCOMMAFIRST=>LASTCOMMAFIRST,
   LASTSPACEFIRST=>LASTSPACEFIRST,
   FIRSTSPACELAST=>FIRSTSPACELAST, 
   totalImg     => $totalImg,
   totalImported=> $totalImported,
   uploaded     => ($fname ne '')?1:0,
);

#-------------------------------------------------------------
sub extactImg2Db{
    my ($dbh,$dir) =@_;
    my @files = <$dir/*>;
    my $fileName=''; 
    my $fileData = '';    
    foreach (@files) {
         $fileName =$_;
        if(-d $fileName){
            extactImg2Db($dbh,$fileName);
        }
        else{
           getUserImg($dbh,$dir,$fileName);

        }
    }

}
#-------------------------------------------------------------
sub getUserImg{
    my ($dbh,$dir,$fName)=@_;
    if($fName ne ''){
        $totalImg++;
        my $fileName = $fName;
        my ($uid,$userbarcode)= (0,'');
        $fileName =~ s/\.([\w\-]+)$//gi;

        my $fileExtension = lc($1);
        if($fileExtension !~ m/^(jpg|jpeg|png|gif)$/gi){
            return;
        }
        
        $fileName =~ s/$dir\///gi; # userbarcode
        if($fNameStructure == BC){
            $uid = getUidByBc($dbh,$fileName);   
            $userbarcode =   $fileName;
        }
        elsif($fNameStructure == SID){
            $uid = getUidBySid($dbh,$fileName);   
            $userbarcode =   $fileName;
        }
        else{
            my ($lastname,$firstname) = parseUserName($fileName,$fNameStructure);
            ($uid,$userbarcode) = getUidBcByName($dbh,$lastname,$firstname);      
        }

        if($uid) {            
            # get data image
            open(DATA, $fName);
            my $fileData;
            while (<DATA>) {
               $fileData .= $_;
            }
            close DATA;
            $fileData = util_resizeImg($fileData,100,125);
            if (!$fileData) {
                $fileData = fixImage($fName,100,125);
            }
            my $rv = updateUserImg($dbh,$uid,$userbarcode,$mimeType->{$fileExtension},$fileData, $fileName ."." .$fileExtension);
            if($rv eq  1) {
                $totalImported++;
            }
        }
    }
}


sub fixImage {
    my ($fName, $newWidth, $newHeight) = @_;

    # fix jpg
    my $new_fName = `/bin/mktemp`;
    system("/usr/bin/jpegicc -n $fName $new_fName");

    open(DATA, $new_fName);
    my $fileData;
    while (<DATA>) {
       $fileData .= $_;
    }
    close DATA;

    unlink $new_fName;

    $fileData = util_resizeImg($fileData, $newWidth, $newHeight);

    return $fileData;
}
#-------------------------------------------------------------
sub getUidByBc {
    my ($dbh,$bc) = @_;
    my $sth = $dbh->prepare(<<_STH_);
select  uid
from    opl_user
where   userbarcode = ?
_STH_
    
    $sth->execute($bc) ;
    my ($uid) = $sth->fetchrow_array;

    if(!$uid){
        $sth = $dbh->prepare(<<_STH_);
select  uid
from    opl_user
where   trim(leading '0' from userbarcode) =  trim(leading '0' from ?)
_STH_
        $sth->execute($bc);
        ($uid) = $sth->fetchrow_array;
    }

    $sth->finish;
    $uid=0 if(!$uid);
    return $uid;
}

#-------------------------------------------------------------
sub getUidBySid {
    my ($dbh,$bc) = @_;
    my $sth = $dbh->prepare(<<_STH_);
select  uid
from    opl_user
where   sid = ?
_STH_
    
    $sth->execute($bc) ;
    my ($uid) = $sth->fetchrow_array;

    if(!$uid){
        $sth = $dbh->prepare(<<_STH_);
select  uid
from    opl_user
where   trim(leading '0' from userbarcode) =  trim(leading '0' from ?)
_STH_
        $sth->execute($bc);
        ($uid) = $sth->fetchrow_array;
    }

    $sth->finish;
    $uid=0 if(!$uid);
    return $uid;
}
#-------------------------------------------------------------
sub getUidBcByName {
    my ($dbh,$lastname,$firstname) = @_;
    my $sth = $dbh->prepare(<<_STH_);
select  uid,userbarcode
from    opl_user
where   lastname = ? && firstname=?
_STH_
    
    $sth->execute($lastname,$firstname) ;
    my ($uid,$bc) = $sth->fetchrow_array;
    ($uid,$bc)=(0,"") if(!$uid);
    $sth->finish;
    return ($uid,$bc);
}

#-------------------------------------------------------------
sub  parseUserName{
     my ($fileName,$nameStructure)=@_;

    my ($lastname,$firstname);
    my $sep =($nameStructure == LASTCOMMAFIRST)?",":" ";
    my @name = split /$sep/, $fileName;
    my $n = scalar(@name);
    if($nameStructure == LASTCOMMAFIRST || $nameStructure == LASTSPACEFIRST ){
        $lastname=@name[0];
        $fileName =~ m/($lastname)($sep)(.*)/g;
        $firstname=$3;

    }
    elsif($nameStructure == FIRSTSPACELAST ){
        $lastname=@name[$n-1];
        $fileName =~ m/(.*)($sep)($lastname)/g;
        $firstname=$1;
    }
    $firstname =~ s/^\s+|\s+$//gi;
    $lastname =~ s/^\s+|\s+$//gi;
    return ($lastname,$firstname);
}
 
#-------------------------------------------------------------
sub updateUserImg {
    my ($dbh,$uid ,$userbarcode,$mimeType, $imgData,$fileName) = @_;
 
    my $sql = <<_STH_;
replace into  opl_userImg
set          uid=?,
             userbarcode=?,
             mimeType = ?,
             thumbnail = ?,
             fileName  =?
_STH_

    my $sth = $dbh->prepare($sql);
    my $rv = $sth->execute($uid ,$userbarcode,$mimeType, $imgData,$fileName);
    $sth->finish;

    return ($rv eq '0E0') ? 0 : 1 ;
}
#-------------------------------------------------------------
#Thu, Jan 07, 2010 @ 13:50:35 EST
my $msgValMap ={};
my $fileMsgMap            =loc_getMsgFile('user/userInfo.msg',$msgValMap);

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

