### Leverages the AWS IoT SDK for Python

# Import SDK packages
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import settings  # importing configuration file
import device  # import device class
import time
import random
import string
import json
import sys

# create devices
dev_names = ['soilSensor1', 'soilSensor2', 'soilSensor3']
devs = []  # set up a list to hold your devices
for i in dev_names:
    devs.append(device.Device(i))


# Create a random 8-character string for connection id
CLIENT_ID = ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(8))

# create AWS IoT MQTT client
client = AWSIoTMQTTClient(CLIENT_ID)

print("Inside python code")
print(sys.argv[1])
IOT_ENDPOINT_ADDRESS = json.loads(sys.argv[1])["endpointAddress"]

# configure client endpoint / port information & then set up certs

client.configureEndpoint(IOT_ENDPOINT_ADDRESS, settings.HOST_PORT)
client.configureCredentials(settings.ROOT_CERT, settings.PRIVATE_KEY, settings.DEVICE_CERT)
print(IOT_ENDPOINT_ADDRESS)

# configure client connection behavior
client.configureOfflinePublishQueueing(-1)  # Infinite offline Publish queueing
client.configureDrainingFrequency(2)  # Draining: 2 Hz
client.configureConnectDisconnectTimeout(10)  # 10 sec
client.configureMQTTOperationTimeout(5)  # 5 sec

print("Connecting to endpoint " + IOT_ENDPOINT_ADDRESS)
client.connect()

# start loop to begin publishing to topic
while True:
    for dev in devs:
        client.publish("device/" + dev.name + "/devicePayload", dev.get_payload(), settings.QOS_LEVEL)
        print("Published message on topic " + "device/" + dev.name + "/devicePayload" + " with payload: " + dev.get_payload())
        dev.update() # update the device with new data
    time.sleep(30) # just wait a sec before publishing next message