import binascii
import json

def extraer_valores(hex_string):
    # Convertir la cadena hexadecimal a bytes
    try:
        raw_bytes = binascii.unhexlify(hex_string)
    except binascii.Error:
        print(f"Error al decodificar los datos: {hex_string}")
        return None

    # Verificar la longitud esperada de los datos
    if len(raw_bytes) < 12:
        print(f"Datos insuficientes: {hex_string}")
        return None
    print ('*'*80)
    print (hex_string)
    print (raw_bytes)
    print ('*'*80)

    # Extraer los datos relevantes
    temp1 = int.from_bytes(raw_bytes[2:4], byteorder='big', signed=True) / 10.0
    temp2 = int.from_bytes(raw_bytes[4:6], byteorder='big', signed=True) / 10.0
    humedad = int.from_bytes(raw_bytes[6:8], byteorder='big')
    estado_bateria = int.from_bytes(raw_bytes[8:10], byteorder='big')

    # Crear un diccionario con los valores extraídos
    datos_extraidos = {
        'temp1': temp1,
        'temp2': temp2,
        'humedad': humedad,
        'estado_bateria': estado_bateria
    }

    return datos_extraidos

def procesar_raw_data(raw_data):
    # Asegurarse de que el dato sea una cadena hexadecimal válida
    try:
        raw_bytes = binascii.unhexlify(raw_data)
    except binascii.Error:
        print(f"Error al decodificar los datos: {raw_data}")
        return None

    # Verificar la longitud esperada de los datos
    if len(raw_bytes) < 12:
        print(f"Datos insuficientes: {raw_data}")
        return None

    # Extraer los datos relevantes
    prefijo = raw_bytes[0:2]

    temp1 = int.from_bytes(raw_bytes[2:4], byteorder='big', signed=True) / 10.0
    temp2 = int.from_bytes(raw_bytes[4:6], byteorder='big', signed=True) / 10.0
    humedad = int.from_bytes(raw_bytes[6:8], byteorder='big')
    estado_bateria = int.from_bytes(raw_bytes[8:10], byteorder='big')

    # Crear un diccionario con los valores extraídos
    datos_extraidos = {
        'prefijo': prefijo.hex(),
        'temp1': temp1,
        'temp2': temp2,
        'humedad': humedad,
        'estado_bateria': estado_bateria
    }

    return datos_extraidos

# Función para procesar los datos depurados
def procesar_datos(data):
    resultado = []
    for item in data:
        if item[0]["Format"] == "Gateway" and item[1]["Format"] == "RawData":
            depurado = {
                "fecha": item[0].get("TimeStamp"),
                "gatewayMAC": item[0].get("GatewayMAC"),
                "BLEMAC": item[1].get("BLEMAC"),
                "RSSI": item[1].get("RSSI"),
                "BLEName": item[1].get("BLEName"),
                "datos": item[1].get("RawData"),
                "datos_procesados": extraer_valores(item[1].get("RawData"))  # Cambiado para usar extraer_valores
            }
            resultado.append(depurado)
    return resultado

# Función principal
def main():
    # Leer datos desde el archivo recepcion.txt
    with open('recepcion.txt', 'r') as file:
        lines = file.readlines()

    # Procesar cada línea como un objeto JSON separado
    datos_depurados = []
    for line in lines:
        try:
            data = json.loads(line.strip())
            datos_depurados.extend(procesar_datos([data]))
        except json.JSONDecodeError:
            print(f"Error al procesar la línea: {line}")

    # Imprimir los resultados
    for depurado in datos_depurados:
        print(depurado)

# Punto de entrada del programa
if __name__ == "__main__":
    main()
