import paho.mqtt.client as mqtt
import time
import os
import sys
import threading
import logging as log

import roc

mqttBroker ="localhost"

resolution = {}
timer = {}
timestamp = {}


def person_detected(device, num):
    timestamp[device] = time.time()
    if device in resolution and resolution[device] == "high":
        return
    set_resolution_high(device)


def start_timer(device):
    # log.info("Start timer for device {}".format(device))
    timer[device] = threading.Timer(10.0, timer_expiry, device)
    timer[device].start()


def remove_timer(device):
    del timer[device]


def set_resolution_high(device):
    set_resolution(device, "high")
    roc.set_uplink_mbr_high()


def set_resolution_low(device):
    set_resolution(device, "low")
    roc.set_uplink_mbr_low()


def set_resolution(device, level):
    log.info("Setting camera {} resolution to {}".format(device, level))
    resolution[device] = level
    if level == "high" and device not in timer:
        start_timer(device)
    client = mqtt.Client()
    client.connect(mqttBroker)
    client.publish("camera/" + str(5000 + int(device)), level)


def timer_expiry(device):
    now = time.time()
    diff = now - timestamp[device]
    # log.info("timer_expiry() - now:{}, timestamp:{}".format(now, timestamp[device]))
    if diff > 5.0:
        set_resolution_low(device)
        remove_timer(device)
    else:
        start_timer(device)
