import json
import socket
import logging
from typing import Any

def send_json(socket: socket.socket, data: Any):
    """Invia dati JSON attraverso un socket"""
    try:
        json_data = json.dumps(data)
        socket.send(json_data.encode('utf-8'))
        return True
    except Exception as e:
        logging.error(f"Error sending JSON: {e}")
        return False

def receive_json(socket: socket.socket, buffer_size: int = 4096):
    """Riceve dati JSON da un socket"""
    try:
        data = socket.recv(buffer_size).decode('utf-8')
        if data:
            return json.loads(data)
        return None
    except Exception as e:
        logging.error(f"Error receiving JSON: {e}")
        return None

def get_local_ip():
    """Ottiene l'IP locale della macchina"""
    try:
        # Connette a un IP pubblico per determinare l'interfaccia di default
        with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
            s.connect(("8.8.8.8", 80))
            return s.getsockname()[0]
    except:
        return "127.0.0.1"

def format_bytes(size: int) -> str:
    """Formatta bytes in formato leggibile"""
    for unit in ['B', 'KB', 'MB', 'GB']:
        if size < 1024.0:
            return f"{size:.2f} {unit}"
        size /= 1024.0
    return f"{size:.2f} TB"