local http = require("socket.http")
local ltn12 = require("ltn12")
local json = require("dkjson")

function Split(value, delimiter)
    local result = {};
    for match in string.gmatch(value, "[^" .. delimiter .. "%s]+") do
        table.insert(result, match);
    end
    return result;
end
-- This functions Covert date (Thu, 13 Oct 2022 13:37:54 GMT) into 20221013_133754
function convertDatetime(dateValue)
    p = "%a+, (%d+) (%a+) (%d+) (%d+):(%d+):(%d+) GMT"
    day, month, year, hour, min, sec = dateValue:match(p)
    MON = {
        Jan = 1,
        Feb = 2,
        Mar = 3,
        Apr = 4,
        May = 5,
        Jun = 6,
        Jul = 7,
        Aug = 8,
        Sep = 9,
        Oct = 10,
        Nov = 11,
        Dec = 12
    }
    month = MON[month]
    offset = os.time() - os.time(os.date("!*t"))
    converted_Datetime = os.time({
        day = day,
        month = month,
        year = year,
        hour = hour,
        min = min,
        sec = sec
    })
    return os.date("%Y%m%d_%H%M%S", converted_Datetime)
end
session:ready()
local uuid = session:getVariable("uuid")
local api = freeswitch.API()
-- Get sata from sip_i_from variable
session:consoleLog("info", "========**************** WELCOME *************=======")
session:consoleLog("info", "**************** SESSION IS READY *************")
session:consoleLog("info", " Fetching Sip Invite From the CUCM ")
local sipFrom = session:getVariable("sip_i_from")
local sipFrom_split = Split(sipFrom, ";")
session:consoleLog("info", " Fetching Leg Type ")
local leg_type = sipFrom_split[2]
session:consoleLog("info", " Fetching Refci ")
local refci = Split(sipFrom_split[3], "=")[2]
local farendrefci = Split(sipFrom_split[7], "=")[2]
session:consoleLog("info", " Farend refci: " .. farendrefci .. "\n")
session:consoleLog("info", " Fetching Date from the Operating System ")
local startDateTime = os.date("%Y-%m-%d %H:%M:%S")
session:consoleLog("info", " Fetching Date from the Sip Invite ")
local datefromsip = convertDatetime(session:getVariable("sip_i_Date"))
session:consoleLog("info", " Fetching Call_ID ")
local call_id = session:getVariable("sip_call_id")
session:consoleLog("info", " Fetching CISCO GUID ")
local ciscoGuid = session:getVariable("sip_i_Cisco_Guid")

local calledNumber = Split(sipFrom_split[6], "=")[2]
local callingNumber = Split(sipFrom_split[10], "=")[2]

if tonumber(farendrefci) > tonumber(refci) then
    -- Swap the values
    local temp = calledNumber
    calledNumber = callingNumber
    callingNumber = temp
end

session:consoleLog("info", " CALLED NUMBER = " .. calledNumber .. "\n")
session:consoleLog("info", "CALLING NUMBER: " .. callingNumber .. "\n")

local startTime = os.date("%Y-%m-%dT%H:%M:%S") 
session:consoleLog("info", "CALL START TIME:  " .. startTime .. "\n")
session:consoleLog("info", " =============== CALLING THE RULE API ================== ")
local url = "http://192.168.1.200:8080/vrs/recording-rules/evaluate"
            .. "?calledNumber=" .. calledNumber
            .. "&callingNumber=" .. callingNumber
            .. "&startTime=" .. startTime

session:consoleLog("info", "Final API URL: " .. url .. "\n")
local response_body = {}

local res, code, headers, status = http.request{
    url = url,
    method = "GET",
    sink = ltn12.sink.table(response_body)
}

local response_json = table.concat(response_body)
session:consoleLog("info", " RULE API RESPONSE: " .. response_json .. "\n")


session:consoleLog("info", "date = " .. datefromsip)
local sipEventType = "SIP_INVITE"
local recording_dir = '/var/vrs/recordings/cucmRecording/streams/'
local filename = uuid .. ".wav"
session:consoleLog("info", "========**************** IN THE LUA FILE     *************=======")
local recording_path = "/var/vrs/recordings/cucmRecording/streams/".. uuid ..".wav"
--session:consoleLog("info", "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-starting the recording via execut=====================================")
local record = "false"  
local api = freeswitch.API()  
local response = json.decode(response_json)
if response and response["recordAudio"] then
    if response["recordAudio"] == true then
        -- Start recording
        --local uuid = session:get_uuid()
        record  = "true"
        api:execute("uuid_record", uuid .. " start " .. recording_path)
        session:consoleLog("info", "RECORDING STARTED : " .. recording_path .. "\n")
 	session:consoleLog("info", " SETTING RECORD TO TRUE:  " .. record .."\n")
    else
	session:consoleLog("info", " RECORDING IS DISABLED BY RULE. \n")
	session:consoleLog("info", " SETTING RECORD TO FALSE:  " .. record .."\n")
    end
end


--api:execute("uuid_record", uuid .. " start " .. recording_path)
session:consoleLog("info","About to enter the loop")
while session:ready() do
    session:sleep(1000)
end
session:consoleLog("info","Loop ended")
local endDateTime = os.date("%Y-%m-%d %H:%M:%S")
session:consoleLog("info", "Start time " .. startDateTime .. " End Time : " .. endDateTime)
session:consoleLog("info", "********* PREPARING PAYLOAD FOR MIXER *************")
session:consoleLog("info",  "==========================================================================================")
session:consoleLog("info",  "SIPFROM")
session:consoleLog("info",  sipFrom)
session:consoleLog("info",  "Start Date Time")
session:consoleLog("info",  startDateTime)
session:consoleLog("info",  "End Date Time")
session:consoleLog("info",   endDateTime)
session:consoleLog("info",  "Call ID")
session:consoleLog("info",   call_id)
session:consoleLog("info",  "CISCO Guild")
session:consoleLog("info",   ciscoGuid)
session:consoleLog("info",  "Sip Event Type")
session:consoleLog("info",   sipEventType)
session:consoleLog("info",  "Recording DIR")
session:consoleLog("info",   recording_dir)
session:consoleLog("info",  "Recording file")
session:consoleLog("info",   recording_filename)
session:consoleLog("info",  "Mixed Rec Dir")
session:consoleLog("info",  "/var/vrs/recordings/cucmRecording/sessions/")
session:consoleLog("info",  "RECORD")
session:consoleLog("info",  record)
session:consoleLog("info",  "==========================================================================================")
local http = require("socket.http")
local ltn12 = require "ltn12"
local json = require "dkjson"
local req_body = {
    sipFrom = sipFrom,
    startdatetime = startDateTime,
    enddatetime = endDateTime,
    callId = call_id,
    ciscoGuid = ciscoGuid,
    sipEventType = "SIP_INVITE",
    recording_dir = recording_dir,
    recording_filename = filename,
    mixedRecordingDir = "/var/vrs/recordings/cucmRecording/sessions/",
    record = record
}
local req_body1 = json.encode(req_body)
freeswitch.consoleLog("info", req_body1)
local response_body = {}
local res, code, headers, status = http.request {
    method = "POST",
    url = "http://192.168.1.200:9900/mixer/sip-data",
    source = ltn12.source.string(req_body1),
    headers = {
        ["content-type"] = "application/json",
        ["Content-Length"] = string.len(req_body1)
    },
    sink = ltn12.sink.table(response_body)
}
freeswitch.consoleLog("INFO", "Data inserted into database")
print("IIIIIIIIIIIIIIIIII")
response = table.concat(response_body)
print(response)
--print(res, code, headers[2], status)
if (leg_type == 'x-farend123') then
    local res, code, headers, status = http.request {
        method = "POST",
        url = "http://192.168.1.200:9900/mixapi",
        source = ltn12.source.string(req_body1),
        headers = {
            ["content-type"] = "application/json",
            ["Content-Length"] = string.len(req_body1)
        },
        sink = ltn12.sink.table(response_body)
    }
end
freeswitch.consoleLog("INFO", "End of Everything")
