import network
import urequests
import json
from machine import Pin, I2C, PWM
from ssd1306 import SSD1306_I2C
import time
import ntptime  # Asegúrate de que esta librería esté disponible en tu firmware

# Configuración WiFi
SSID = 'GusyOski'          # Reemplaza con el SSID de tu red WiFi
PASSWORD_WIFI = 'Gusta3729'  # Reemplaza con la contraseña de tu red WiFi

def conectar_wifi(ssid, password):
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('Conectando a la red WiFi...')
        wlan.connect(ssid, password)
        timeout = 10  # Tiempo máximo en segundos para intentar conectar
        start_time = time.time()
        while not wlan.isconnected():
            if time.time() - start_time > timeout:
                print('No se pudo conectar a la red WiFi')
                return False
            time.sleep(1)
    print('Conexión establecida:', wlan.ifconfig())
    return True

def sincronizar_hora():
    try:
        ntptime.settime()  # Sincroniza la hora local desde un servidor NTP
        print('Hora sincronizada:', time.localtime())
    except Exception as e:
        print(f"Error al sincronizar la hora: {e}")

def enviar_datos(mensaje):
    url = "https://auth-db855.hstgr.io/index.php?db=u588746708_barcito"  # Usar HTTPS si está disponible
    headers = {'Content-Type': 'application/json'}
    
    # Obtener la fecha y hora actuales
    fecha_hora = time.strftime('%Y-%m-%d %H:%M:%S')
    
    # Verificar que la fecha y hora sean razonables
    if fecha_hora == '1970-01-01 00:00:00':
        print("Fecha y hora no están sincronizadas.")
        return
    
    payload = {
        'mensaje': mensaje,
        'timestamp': fecha_hora
    }
    
    try:
        response = urequests.post(url, data=json.dumps(payload), headers=headers)
        if response.status_code == 201:
            print("Datos guardados exitosamente")
        else:
            print(f"Error al guardar datos: {response.text}")
        response.close()
    except Exception as e:
        print(f"Error al enviar datos: {e}")

# Inicialización de hardware
ancho = 128
alto = 64
buzzer = PWM(Pin(13), freq=440, duty=512)
pir = Pin(23, Pin.IN, Pin.PULL_DOWN)
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = SSD1306_I2C(ancho, alto, i2c)

def sonido(freq, sleep_time):
    buzzer.freq(freq)
    buzzer.duty(512)
    time.sleep(sleep_time)

# Conectar a WiFi
if conectar_wifi(SSID, PASSWORD_WIFI):
    # Sincronizar hora
    sincronizar_hora()
    
    while True:
        if pir.value() == 1:
            print("Movimiento Detectado")
            
            # Enviar datos a la API con mensaje y timestamp
            enviar_datos("Movimiento Detectado")
            
            for _ in range(5):
                sonido(440, 0.3)
                oled.text("INTRUSO", 35, 20)
                oled.text("DETECTADO !!!", 25, 30)
                oled.show()
                time.sleep(1)
                sonido(900, 0.5)
                oled.fill(0)  
                oled.show()
        else:
            print("Sin Movimientos")
            oled.fill(0)
            oled.show()
            buzzer.duty(0)
            time.sleep(1)
else:
    print("No se pudo establecer la conexión WiFi. Verifica tus credenciales.")