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) < 15:  # Verificamos si hay al menos 15 bytes
        print(f"Datos insuficientes: {hex_string}")
        return None

    # Verificar que el prefijo sea CD00
    if raw_bytes[5] != 0xCD or raw_bytes[6] != 0x00:
        print(f"Prefijo incorrecto: {hex_string}")
        return None

    # Extraer los datos relevantes
    temp2 = raw_bytes[7] + raw_bytes[8] * 256
    temp1 = raw_bytes[9] + raw_bytes[10] * 256
    hume = raw_bytes[11] + raw_bytes[12] * 256
    bat = raw_bytes[13] + raw_bytes[14] * 256

    # Verificar y ajustar los valores de temp1 y temp2 si son mayores a 32767
    if temp1 > 32767:
        temp1 -= 65536
    if temp2 > 32767:
        temp2 -= 65536

    # Procesar los valores de temp1 y temp2
    temp1_val = temp1 / 10.0
    temp2_val = temp2 / 10.0

    if temp1_val == -99.9:
        temp1_val = "Desconectado"
    if temp2_val == -99.9:
        temp2_val = "Desconectado"

    # Procesar el valor de humedad
    if hume == 0:
        hume_val = "Desconectado"
    else:
        hume_val = hume

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

    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()
