from machine import Pin, I2C
from neopixel import NeoPixel
from ssd1306 import SSD1306_I2C
from rede import Rede
from time import sleep_ms
from umqttsimple import MQTTClient
import ujson  # Certifique-se de usar ujson para carregar JSON

# Inicializações
i2c = I2C(0)
oled = SSD1306_I2C(128, 64, i2c)

np = NeoPixel(Pin(17, Pin.OUT), 1)
pixels = NeoPixel(Pin(2, Pin.OUT), 3)

botoes = (Pin(19, Pin.IN, Pin.PULL_DOWN),
          Pin(18, Pin.IN, Pin.PULL_DOWN),
          Pin(16, Pin.IN, Pin.PULL_DOWN))

b = [0, 0, 0]
bAnt = [0, 0, 0]

topicos = (b'/ifrsgauto/projetos/sala/luminaria/comando',
           b'/ifrsgauto/projetos/sala/luminaria/c2',
           b'/ifrsgauto/projetos/sala/luminaria/c3')

msgOn = (b'{"modo":"manual", "nivel":3}',
         b'acionei o c2',
         b'acionei o c3')

msgOff = (b'{"modo":"manual", "nivel":0}',
          b'desliguei o c2',
          b'desliguei o c3')

def indica(arg):
    np[0] = arg
    np.write()

def indica2(arg):
    oled.fill(0)
    oled.text(arg, 10, 10)
    oled.show()

net = Rede('Wokwi-GUEST', '', cb=indica2)
indica((255, 128, 0))
indica2('Desconectando')
net.desconectar()

'''
def trataMsg(topico, conteudo):
    global automatico, c
    print(topico, ',', conteudo)
    if topico == topcomandos:
        texto = conteudo.decode()
        dados = ujson.loads(texto)
        if 'modo' in dados:
            automatico = dados['modo'] == 'automatico'
            if 'nivel3' in dados:
                c = dados['nivel3']

topcomandos = '/ifrsgauto/projetos/sala/luminaria/comando'
'''

# Verificação da Conexão
conexao = True  # Defina como True ou False conforme necessário
'''
if conexao:
    cliente = MQTTClient('broker.hivemq.com', '2024S1lumnini')
    cliente.set_callback(trataMsg)  # Certifique-se de que a função `trataMsg` é usada
    cliente.connect()
    cliente.subscribe(topcomandos)
'''
indica((255, 255, 0))
indica2('Conectando')

if not net.conectado:
    net.configurar('192.168.0.204', '255.255.255.0', '192.168.0.1', '8.8.8.8')
    net.conectar()

if net.conectado:
    indica((0, 0, 255))
    indica2('Conectado')
    mqtt = MQTTClient('xxy2024S1lumnini', 'broker.hivemq.com')
    mqtt.connect()
else:
    indica((255, 0, 0))
    indica2('Desconectado')

while True:
    for posicao in range(3):
        b[posicao] = botoes[posicao].value()
        if b[posicao] != bAnt[posicao]:
            if b[posicao] == 1:
                if pixels[posicao] != (0, 0, 0): 
                    pixels[posicao] = (0, 0, 0)
                    if net.conectado:
                        mqtt.publish(topico[posicao], msgOff[posicao])
                else:
                    pixels[posicao] = (0, 0, 255)
                    if net.conectado:
                        mqtt.publish(topico[posicao], msgOn[posicao])
                pixels.write()
            sleep_ms(200)      
            bAnt[posicao] = b[posicao]