#!/usr/bin/lua
--
-- example_01.lua
-- ~~~~~~~~~~~~~~
-- Version: 0.2 2012-06-01
-- ------------------------------------------------------------------------- --
-- Copyright (c) 2011-2012 Geekscape Pty. Ltd.
-- All rights reserved. This program and the accompanying materials
-- are made available under the terms of the Eclipse Public License v1.0
-- which accompanies this distribution, and is available at
-- http://www.eclipse.org/legal/epl-v10.html
--
-- Contributors:
--    Andy Gelme - Initial implementation
-- -------------------------------------------------------------------------- --
--
-- Description
-- ~~~~~~~~~~~
-- Subscribe to a topic on one MQTT server and publish all received messages
-- to a topic on another MQTT server.
--
-- ToDo
-- ~~~~
-- - On failure, automatically reconnect to MQTT server(s).
-- ------------------------------------------------------------------------- --

function callback(
  topic,    -- string
  message)  -- string

  print("Topic: " .. topic .. ", message: '" .. message .. "'")

  mqtt_client2:publish(args.topic_p, message)
end

-- ------------------------------------------------------------------------- --

function is_openwrt()
  return(os.getenv("USER") == "root")  -- Assume logged in as "root" on OpenWRT
end

-- ------------------------------------------------------------------------- --

if (not is_openwrt()) then require("luarocks.require") end
local lapp = require("pl.lapp")

args = lapp [[
  Subscribe to topic_s and publish all messages on topic_p
  -g,--host_s   (default localhost)   Subscribe MQTT server hostname
  -H,--host_p   (default localhost)   Publish MQTT server hostname
  -i,--id       (default example_01)  MQTT client identifier
  -p,--port_s   (default 1883)        Subscribe MQTT server port number
  -q,--port_p   (default 1883)        Publish MQTT server port number
  -s,--topic_s  (default test/1)      Subscribe topic
  -t,--topic_p  (default test/2)      Publish topic
]]

local MQTT = require("mqtt_library")

local mqtt_client1 = MQTT.client.create(args.host_s, args.port_s, callback)
local mqtt_client2 = MQTT.client.create(args.host_p, args.port_p)

mqtt_client1:connect(args.id .. "a")
mqtt_client2:connect(args.id .. "b")

mqtt_client1:subscribe({ args.topic_s })

local error_message1 = nil
local error_message2 = nil

while (error_message1 == nil and error_message2 == nil) do
  error_message1 = mqtt_client1:handler()
  error_message2 = mqtt_client2:handler()
  socket.sleep(1.0)  -- seconds
end

if (error_message1 == nil) then
  mqtt_client1:unsubscribe({ args.topic_s })
  mqtt_client1:destroy()
else
  print(error_message1)
end

if (error_message2 == nil) then
  mqtt_client2:destroy()
else
  print(error_message2)
end

-- ------------------------------------------------------------------------- --
