#
# Copyright (c) dushin.net  All Rights Reserved
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#    * Redistributions of source code must retain the above copyright
#      notice, this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above copyright
#      notice, this list of conditions and the following disclaimer in the
#      documentation and/or other materials provided with the distribution.
#    * Neither the name of dushin.net nor the
#      names of its contributors may be used to endorse or promote products
#      derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY dushin.net ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL dushin.net BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

import mqtt.simple
import ujson

class Sink :
    
    def __init__(self, config) :
        name = config['name'] if 'name' in config else 'esp8266'
        host = config['host']
        port = config['port'] if 'port' in config else 0
        self.retries = config['retries'] if 'retries' in config else 1
        self.retain = config['retain'] if 'retain' in config else False
        self.qos = config['qos'] if 'qos' in config else 0
        self.topic = config['topic'] if 'topic' in config else 'log'
        self.client = mqtt.simple.MQTTClient(client_id=name, server=host, port=port)

    def log(self, message) :
        msg = ujson.dumps(message)
        for i in range(1 + self.retries) :
            try :
                self.try_connect()
                self.client.publish(self.topic, msgretain=self.retain, qos=self.qos)
                return
            except Exception as e :
                print("Error publishing to MQTT Server: {}".format(e))
                self.connected = False

    def try_connect() :
        if not self.connected :
            try :
                self.client.connect()
                self.connected = True
            except Exception as e :
                print("Error connecting to MQTT Server: {}".format(e))
                self.connected = False
