#!/usr/bin/perl

#use utf8;
use strict;

use Encode;
use LWP::UserAgent;
use HTTP::Request::Common;

use CGI;
use JSON;

use Opals::Context;
use Opals::Constant;
use Time::localtime;

use Opals::Template qw(
    tmpl_read
    tmpl_write
);
use Opals::Eq_BarcodeMgmt qw(
    eq_bcm_getVendorList
    eq_bcm_alignTakenBc
);

my $bcmRangeInfo = {};
my $dbh = Opals::Context->dbh();
END { $dbh->disconnect(); }
my $loginuid = $ENV{'curUserId'};
open debug, ">/tmp/debugK";
print debug "loginuid:$loginuid\n";
my $status = 0;
    my $sql_insert_bcmVendor=" insert into eq_bcmVendor set  vendor = ? ";
    
    my $sql_insert_bcmRange= " insert into eq_bcmRange 
set  vid    = ?,
     bcLen  = ?,
     preFix = ?,
     rangeFr= ?,
     rangeTo= ?  
";
    
    my $sql_insert_bcmBc= " insert into eq_bcmBc
set  rid    = ?,
     barcode = ?
";

    my $sql_del_bcmVendor ="delete from eq_bcmVendor where vid = ?";
    my $sql_del_bcmRange = "delete from eq_bcmRange where rid =?";
    my $sql_del_bcmBc = "delete from eq_bcmBc where rid =?";

    my $sql_update_bcmVendor ="update   eq_bcmVendor 
set      vendor = ?
where    vid    = ?";

    my $sql_update_bcmRange = "update  eq_bcmRange 
set     bcLen  = ?,
        preFix = ?,
        rangeFr= ?,
        rangeTo= ?
where vid =? && rid =?
";

my $vendorList=[];
my $bcList=[];
my $vendor;
print debug "requst_method: $ENV{'REQUEST_METHOD'} \n";

if ($ENV{'REQUEST_METHOD'} eq "POST") {
    my $json ="";
    while (<STDIN>) {
        $json .= $_;
    }
    print debug "bcmRangeInfoJSON: $json \n";
    $bcmRangeInfo = decode_json($json);
    my $op = $bcmRangeInfo->{'op'};
    my $filter = $bcmRangeInfo->{'filter'};
    if (defined $bcmRangeInfo && $op =~ m/add|edit|delete/) {
        editBarcodeRangeInfo($dbh,$bcmRangeInfo);
        $status=1;
        $vendorList = eq_bcm_getVendorList($dbh);
    }
    elsif(defined $bcmRangeInfo && $filter =~ m/all|taken|available/ && $op eq ""){
        print debug "getBcList \n";
        my $vid = $bcmRangeInfo->{'vendorId'};
        my $rid = $bcmRangeInfo->{'rId'};
        my $pNum = $bcmRangeInfo->{'pNum'};
        my $pSize = $bcmRangeInfo->{'pSize'} || 50;
        print debug "pNum:$pNum \n";
        my $offset = ($pNum-1) * $pSize;
        print debug "offset: $offset \n";
        $bcList=getBcListByStatus($dbh,$rid,$filter,$offset, $pSize);
        $status=1;
        $vendorList = eq_bcm_getVendorList($dbh,$vid,$rid,$filter);
        $vendor = $vendorList->[0];
    }
    else{
        $status=1;
        $vendorList = eq_bcm_getVendorList($dbh);
    }
}
else{
    $status=1;
    $vendorList = eq_bcm_getVendorList($dbh);
}
    print debug to_json($vendorList), "\n";
close debug;
print "Content-type: text/plain\n\n";
print  to_json({
        status    =>$status,
        vendorList=>$vendorList,
        vendor    => $vendor,
        bcList    =>$bcList }
);

sub editBarcodeRangeInfo {

    my ($dbh,$bcmInfo) = @_;
    my ($vendorId,$vendor) = ($bcmInfo->{'vendorId'},$bcmInfo->{'vendor'});
    my $rangeId = $bcmInfo->{'rId'};
    my ($bcLen,$bcPrefix,$rangeFr,$rangeTo)=($bcmInfo->{'bcLength'},$bcmInfo->{'bcPrefix'},$bcmInfo->{'rangeFr'},$bcmInfo->{'rangeTo'});

    if (!$vendorId || $vendorId == 0 && $bcmInfo->{'op'} eq 'add') {
        addBcmVendor($dbh,$vendor,$bcLen,$bcPrefix,$rangeFr,$rangeTo);
        eq_bcm_alignTakenBc($dbh);
    }
    elsif($vendorId && $vendorId > 0 && (!$bcmInfo->{'op'} || $bcmInfo->{'op'} eq 'edit')){
        updateBcmVendor($dbh,$vendor,$vendorId,$rangeId,$bcLen,$bcPrefix,$rangeFr,$rangeTo);
        eq_bcm_alignTakenBc($dbh);
    } 
    elsif($vendorId && $vendorId > 0 && (!$bcmInfo->{'op'} || $bcmInfo->{'op'} eq 'delete') ){
        deleteBcmVendor($dbh,$vendorId,$rangeId);
    } 
    return 1;
}

sub addBcmVendor {
    my ($dbh,$vendor,$bcLen,$bcPrefix,$rangeFr,$rangeTo)  = @_;
    my ($vid) = $dbh->selectrow_array("select vid from eq_bcmVendor where vendor='$vendor'");
    print debug "vid: $vid\n";
    if(!$vid || $vid==0){
        my $sth = $dbh->prepare($sql_insert_bcmVendor);
        my $result = $sth->execute($vendor);
        if($result eq '0E0' ) {
            return;
        }
        $vid = $dbh->{'mysql_insertid'};
    }
    my $sth = $dbh->prepare($sql_insert_bcmRange);
    $sth->execute($vid,$bcLen,$bcPrefix,$rangeFr,$rangeTo);
    my $rid = $dbh->{'mysql_insertid'};
    if($rid =='' || !$rid || $rid ==0) {
        return;
    }
    addBarcodeListByRange($dbh,$rid,$bcLen,$bcPrefix,$rangeFr,$rangeTo);
    $sth->finish;
}

sub addBarcodeListByRange{
    my ($dbh,$rid,$bcLen,$bcPrefix,$rangeFr,$rangeTo) =@_;
    my $bc='';
    my $sth;
    for(my $i=$rangeFr;$i <=$rangeTo;$i++){
        my $padLen=$bcLen - length($bcPrefix);
        $bc = sprintf("%s%0*d",$bcPrefix,$padLen,$i);
        $sth = $dbh->prepare($sql_insert_bcmBc);
        $sth->execute($rid,$bc);
    }
    $sth->finish;
}

sub deleteBcmVendor {
    my ($dbh,$vid,$rid)  = @_;
    my $sth = $dbh->prepare($sql_del_bcmVendor);
    $sth->execute($vid);
    $sth->finish;
        
    $sth = $dbh->prepare($sql_del_bcmRange);
    $sth->execute($rid);
    $sth->finish;

    $sth = $dbh->prepare($sql_del_bcmBc);
    $sth->execute($rid);
    $sth->finish;


}
sub updateBcmVendor {
    my ($dbh,$vendor,$vid,$rid,$bcLen,$bcPrefix,$rangeFr,$rangeTo)  = @_;

    my $sth = $dbh->prepare($sql_update_bcmVendor);
    $sth->execute($vendor,$vid);
    $sth->finish;

    $sth = $dbh->prepare($sql_update_bcmRange);
    $sth->execute($bcLen,$bcPrefix,$rangeFr,$rangeTo,$vid,$rid);
    $sth = $dbh->prepare($sql_del_bcmBc);
    $sth->execute($rid);
    $sth->finish;
    
    addBarcodeListByRange($dbh,$rid,$bcLen,$bcPrefix,$rangeFr,$rangeTo);
    $sth->finish;

}

sub getBcListByStatus{
    my($dbh,$rid,$status,$offset,$size)=@_;
    
    $offset=0 if(!defined $offset);
    $size=25 if(!defined $size);
    my $bcList=[];
    my $sql="select barcode from eq_bcmBc where rid=$rid ";
    $sql .=" && status='$status' " if(defined $status && $status ne 'all' && $status ne '');
    $sql .=" order by barcode limit $offset,$size";
    if($status eq 'taken'){
        $sql="select b.barcode,r.rname as title from eq_bcmBc b 
                     inner join eq_items i using(barcode) 
                     inner join eq_records r on r.rid =i.rid
                 where b.rid=$rid ";
        $sql .=" && status='$status' ";
        $sql .=" order by b.barcode desc limit $offset,$size";
    }
    my $sth=$dbh->prepare($sql);
    $sth->execute();
    my $i=1;
    while(my $bc=$sth->fetchrow_hashref()){
        push @$bcList,$bc;
    }
    return $bcList;
}

