#!/usr/local/bin/lua 
json = require("json");
dofile("/usr/local/freeswitch/scripts/config.lua");


function findDialMethod(numlist)
    if(string.find(numlist,"|")) then
         dialmethod = "ringall"
    else
         dialmethod = "roundrobin"
    end
    show_info("Dial Method :: "..dialmethod)
    return dialmethod;
end


function toTable(s,method)
   numbers={};
   if(method == "roundrobin"  or method == "obconf" ) then
     for n in s:gmatch("([^,]+)") do
      n = n:sub(1, -4)
      table.insert(numbers, n);
     end
    end

    if(method == "ringall" ) then
      for n in s:gmatch("([^|]+)") do
        n = n:sub(1, -4)
       table.insert(numbers, n);
      end
    end

    show_info("Table Length :: "..#numbers)
    return numbers;
end


function getRingTimeOut(s)
  show_info("NUMBER AGENT ::::::: "..s)
  t = {}
  k = 1
  for k,v in string.gmatch(s, "(%w+)#(%w+)") do
     t[k] = v
     show_info("Values ring timeout :: "..t[k])
     k = k+1
     --return t[k]
  end
  return t[k]
end


function file_exists(name,recurl,x)
   local f = io.open(name,"r")
   if(f~=nil) then
    io.close(f)
    recorduri = "http://XXX.in/callrecordings/"..recurl
    session:setVariable("callrecording_file",recorduri);
    show_info("File exist")
   else
    recorduri = "NA"
    show_info("File does not exist")
   end
   return recorduri;
end


function callTransfer(x)
   
    strttime = os.date("%Y-%m-%d %H:%M:%S")
    show_info("time is :: "..strttime)

    Start_T = os.time()
    show_info("transfer to agent time is :: "..Start_T) 
    
   
      session:setAutoHangup(false)
      dialstr = "";
      show_info("Number List :: "..value);
      if(value == 'NA') then
            show_info("There is no Numbers Available")
            value = "0000000000#10"
      end

      calltype = findDialMethod(value)
      ring_timeout = getRingTimeOut(value)
      
      if(calltype == "roundrobin") then
           dialsep = "|";
           v = toTable(value,calltype);
           i = 1;
           while (i <= #v) do
              abc = "[leg_timeout="..tonumber(ring_timeout).."]"
              dialstr = dialstr..abc..TRUNK..v[i]..dialsep
             i = i+1;
           end
      end

      if(calltype == "ringall") then
           dialsep = ",";
           v = toTable(value,calltype);
           i = 1;
           while (i <= #v) do
             abc = "[leg_timeout="..tonumber(ring_timeout).."]"
             dialstr = dialstr..abc..TRUNK..v[i]..dialsep
             i = i+1;
           end

          dialstr = dialstr:sub(1, -2);
          show_info("DIAL STRING "..dialstr)
      end
      show_info("Time Out ::" ..ring_timeout);
      show_info("Dialing Numbers ::"..dialstr);
      
      session:answer()

      session:execute("set", "RECORD_TITLE=Recording ${destination_number} ${caller_id_number} ${strftime(%Y-%m-%d %H:%M)}")
      session:execute("set", "RECORD_COPYRIGHT=(c) 2015")
      session:execute("set", "RECORD_SOFTWARE=XXX")
      session:execute("set", "RECORD_ARTIST=XXX")
      session:execute("set", "RECORD_COMMENT=XXX")
      session:execute("set", "RECORD_DATE=${strftime(%Y-%m-%d %H:%M)}")
      session:execute("set", "RECORD_STEREO=true")
      callrecPath = CALLRECORDING..userid
      directoryexists = directory_exists(callrecPath);
      recording_file = "REC_"..caller_id_number.."_"..destination_number.."_"..os.date("%Y%m%d_%H%M%S")..".mp3"
      recordingPath = callrecPath.."/"..recording_file
      show_info("Recording Path "..recordingPath )
      recurl = userid.."/"..recording_file
      show_info("Recording URL "..recurl)
      show_info("time before bridge .."..start_time)
      session:execute("export","execute_on_answer=record_session "..recordingPath)
      session:execute("export","uid="..uuid)
      session:execute("export","client_id="..userid)
      --session:execute("ring_ready");
      session:setVariable("ringback",res1);
      
      dialstring = "{ignore_early_media=true,hangup_after_bridge=false,continue_on_fail=true}"..dialstr

      show_info("DIALSTRING :: "..dialstring)
      session1 = freeswitch.Session(dialstring,session)

      hcause = session1:hangupCause()
      show_info("Hangup Cause :: "..hcause)

      session:sleep(1000)
      freeswitch.bridge(session,session1)

      
      if(hcause == "SUCCESS") then
          LegB_end_time = os.date("%Y-%m-%d %H:%M:%S")
          show_info("Leg B time is :: "..LegB_end_time)
          end_T = os.time()
          show_info("transfer to agent time is :: "..end_T)
          local action = "calltransfer"
          agent = agent_number 
          agent_number = session:getVariable("last_sent_callee_id_number")
          show_info("agent number is :: "..agent_number);
          session:setVariable("agent",agent_number);
          session:setVariable("action",action)
         
          file_exists(recordingPath,recurl,x)
          tansfer_duration = os.difftime(end_T, Start_T)
          show_info("leg B time is :: "..transfer_duration)
          session:setVariable("transfer_duration", transfer_duration)
          return "exit"
      end
 

function flowaction(x,level,count)
           session:answer()
       
   
 if(x.action == "calltransfer") then 
          
     callTransfer(x)
 
else
    show_info("Conditions does not matched");
end
end



function myHangupHook(s, status, arg)
   freeswitch.consoleLog("NOTICE", "myHangupHook: " .. status .. "\n UUID" .. uuid)

end


session:setAutoHangup(false)
session:setHangupHook("myHangupHook", client_id)
session:setVariable("session_in_hangup_hook","true")

client_id = '';
dtmf_first_value = 'NA';
user_status = '';
project_id = '';
sticky_flag = '';
agent = '';
agent_number = '';
recorduri = '';
vmdownurl = '';
confuri = '';
record_uri = '';


if(session:ready()) then
  current_time = os.time()
  show_info("current time is ::  "..current_time)
  start_time = os.date("%Y-%m-%d %H:%M:%S")
  show_info("START TIME .... "..start_time)
  caller_id_number = session:getVariable("caller_id_number");
  caller_id_number = caller_id_number:sub(-10);
  destination_number = session:getVariable("destination_number");
  uuid = session:getVariable("uuid");
  show_info("UUID:: " .. uuid);

end


url = "http://XXXX.getmainmenu.php?didno="..destination_number.."&mobile="..caller_id_number;
show_info("URL:: " .. url);
apiHit(url);
userid = x.userid;
session:setVariable("client_id",userid);
action = x.action;
session:setVariable("action",action);
user_status = x.user_status;
session:setVariable("user_status",user_status);
project_id = x.project_id;
session:setVariable("project_id",project_id);
uid = uuid;
session:setVariable("uid",uid)
vnum = x.vnum;
session:setVariable("vnum",vnum);
show_info("DID NUMBER is ::" ..vnum);
recordingPath = '';
recurl = '';
vrecpath =  '';
vaudiofile = '';
conf_recording = '';
level = tonumber(0);
count = 0;
transfer_duration = tonumber(0);


answered_time = os.date("%Y-%m-%d %H:%M:%S")
freeswitch.consoleLog("NOTICE", "Answered Time".." "..answered_time .."\n")
process = flowaction(x,level,count);
end_time = os.date("%Y-%m-%d %H:%M:%S")
freeswitch.consoleLog("NOTICE", "End Time".." "..end_time .."\n")
endTime = os.time()
show_info("end time is :: "..endTime)
ivr_duration = os.difftime(endTime, current_time)
freeswitch.consoleLog("NOTICE", "Leg A duration is".." "..ivr_duration .."\n")
session:setVariable("ivr_duration", ivr_duration);
  



 
if(x.action == 'calltransfer') then
   session:setVariable("agent",agent_number);
   record_uri = file_exists(recordingPath,recurl,x)
 end  

ifunction getFirstDtmf(fd)
   if(fd == nil) then
     dtmf_first_value = 'NA'
   end

   if(dtmf_first_value) then
     show_info("DTMF Value :: "..dtmf_first_value)
   end

   return dtmf_first_value
end


show_info("DTMF FIRST INPUT BY CUSTOMRE ::"..type(dtmf_first_value))
getDtmf = getFirstDtmf(dtmf_first_value)
session:hangup()

cdr_log = "http://XXX.callllogs_fs.php?user_id="..userid.."&did_no="..destination_number.."&caller="..caller_id_number.."&%20start_date="..string.gsub(start_time, "%s+", '%%20').."&end_date="..string.gsub(end_time, "%s+", '%%20').."&dtmf="..dtmf_first_value.."&record_uri="..record_uri.."&action="..string.gsub(x.action, "%s+", '%%20').."&agent="..agent_number.."&op_type=va_calllog&sms_action=$%7Bsms_action%7D&projectid="..x.project_id.."&level="..level.."&ruleid="..x.ruleid.."&pickup="..string.gsub(answered_time, "%s+", '%%20').."&hangup="..string.gsub(end_time, "%s+", '%%20').."&ivr_duration="..string.gsub(ivr_duration, "%s+", "").."&transfer_duration="..string.gsub(transfer_duration, "%s+", "").."&vm_record_uri="..vmdownurl.."&vnum="..vnum
show_info("CDR API CALL ".. cdr_log)
api = freeswitch.API();
cdr_log_resp =  api:execute("curl",cdr_log);


show_info(x.userid..","..destination_number..","..caller_id_number..","..x.action..","..uuid..","..start_time..","..end_time..","..file_exists(recordingPath,recurl)..","..level..","..getFirstDtmf())


for k,v in pairs (x) do
  show_info("{\"" .. k .. "\" : \"" .. v .. "\"}");
end
show_info("######### " .. x.action);

