/*------------------------------------------------------------------------
    File        : pushMessage.p
    Purpose     : 

    Syntax      :

    Description : 

    Author(s)   : 
    Created     : Wed May 04 13:20:59 FET 2016
    Notes       :
  ----------------------------------------------------------------------*/

/* ***************************  Definitions  ************************** */

routine-level on error undo, throw.

define input  parameter channelName         as character    no-undo.
define input  parameter messageData         as longchar     no-undo.
define output parameter responseChannel     as character    no-undo.
define output parameter broadcastResponse   as logical      no-undo.
define output parameter responseData        as longchar     no-undo.
    
/* ***************************  Main Block  *************************** */
{io/akera/json/library.i}
{demo/api/pushLib.i}

define variable msgSender as character no-undo.
define variable msgBody   as character no-undo.
define variable msgQuery  as character no-undo.

if json-parse(messageData, table jsonData by-reference) then 
do:
    assign 
        msgSender = string(json-read-string(json-read-element(table jsonData by-reference, '/':u, 'sender':u)))
        msgBody   = string(json-read-string(json-read-element(table jsonData by-reference, '/':u, 'message':u))).
end.
else 
do:
    assign 
        msgSender = 'guest':u
        msgBody   = messageData.
end.

run addMessage (msgSender, msgBody).

if num-entries(msgBody, ':':u) eq 2 then 
do:
    assign 
        msgQuery = entry(1, msgBody, ':':u)
        msgBody  = entry(2, msgBody, ':':u).
end.

case msgQuery:
    when 'info' then 
        do:
            responseData = 'no item found'.
            
            for each item no-lock where Item.ItemName contains msgBody:
                responseData = substitute('&1 - price: &2, weight: &3', Item.ItemName, Item.Price, Item.Weight).
                leave.
            end.
        end.
    when 'stock' then 
        do:
            responseData = 'no item found'.
            
            for each item no-lock where Item.ItemName contains msgBody:
                responseData = substitute('&1 - onhand: &2, onorder: &3', Item.ItemName, Item.Onhand, Item.OnOrder).
                leave.
            end.
            
        end.
end case.

/* send query responses as private, broadcast everything else */
if responseData > '':u then 
do:
    if responseData = 'no item found' then
        responseData = substitute('Hi &1, we are sorry but could not find any product containing: &2.':u, msgSender, msgBody).
    else
        responseData = substitute('Hi &1, this is the product &2: &3.':u, msgSender, msgQuery, responseData).
    
    msgSender = 'Merlin'.    
    run addMessage (msgSender, responseData).
    
    responseData = substitute('~{"sender": "&1", "message": "&2"~}':u, msgSender, responseData).
end.
else
    assign broadcastResponse = true
           responseData      = messageData.

 