import os
from datetime import datetime
import socket
from py_dotenv import  read_dotenv
import json
import paho.mqtt.client as mqtt

read_dotenv("/home/orangepi/opencv/.env")

idsystem      = os.getenv("id")
mqtt_host     = str(os.getenv("mqtt_host"))
mqtt_port     = int(os.getenv("mqtt_port"))
mqtt_keepalive= int(os.getenv("mqtt_keepalive"))
ignicion      = os.getenv("igni")
act_igni      = os.getenv("act_igni")



def get_memory_info():
    with open('/proc/meminfo') as file:
        lines = file.readlines()
        memory_info = {}
        for line in lines:
            key, value = line.split(':')
            memory_info[key.strip()] = int(value.strip().split()[0])
        return memory_info

def get_disk_stats():
    with open('/proc/diskstats') as file:
        lines = file.readlines()
        disk_stats = {}
        for line in lines:
            fields = line.strip().split()
            device_name = fields[2]
            reads_completed = int(fields[3])
            writes_completed = int(fields[7])
            disk_stats[device_name] = {'reads_completed': reads_completed, 'writes_completed': writes_completed}
        return disk_stats


def obtener_ip_local():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))
        ip_local = s.getsockname()[0]
        return ip_local
    except socket.error:
        return None


def get_cpu_temperature():
    with open('/sys/class/thermal/thermal_zone0/temp') as file:
        temp_str = file.read().strip()
        temp_celsius = int(temp_str) / 1000
        return temp_celsius

def get_memory_usage():
    memory_info = get_memory_info()
    total_memory = memory_info['MemTotal']
    free_memory = memory_info['MemFree']
    used_memory = total_memory - free_memory
    memory_usage_percentage = (used_memory / total_memory) * 100
    return memory_usage_percentage

def get_storage_usage():
    # Assuming that the root partition is mounted on "/"
    statvfs = os.statvfs('/')
    total_bytes = statvfs.f_frsize * statvfs.f_blocks
    free_bytes = statvfs.f_frsize * statvfs.f_bfree
    used_bytes = total_bytes - free_bytes
    storage_usage_percentage = (used_bytes / total_bytes) * 100
    return storage_usage_percentage

def heardbeat():

    heardbeat=[{
        "idsystem":idsystem,
	"ignicion":ignicion,
        "act_igni":act_igni,
        "date_time":datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        "ip_local":obtener_ip_local(),
        "telemetry":{
          "memory":get_memory_usage(),
          "disk":get_storage_usage(),
          "cpu_temperature":get_cpu_temperature(),
        }
    }]

    print (heardbeat)
    return heardbeat


def writepulse():
    hb=heardbeat()
    client = mqtt.Client()
    client.connect(mqtt_host, mqtt_port, mqtt_keepalive)
    client.loop_start()
    topic = "mqttnubbe/cameras/heardbeat"
    mensaje = "enviando pulso..."
    json_data = json.dumps(hb)
    client.publish(topic, json_data)
    client.loop_stop()

if __name__ == "__main__":
    writepulse()

