import hmac
import hashlib
import struct
import time

def calcola_hmac(passphrase: str, dati: bytes) -> bytes:
    """Calcola la firma HMAC-SHA1 richiesta dalle reti FreeDMR/HBLink."""
    return hmac.new(passphrase.encode('utf-8'), dati, hashlib.sha1).digest()

def crea_pacchetto_ping(peer_id: int, passphrase: str) -> bytes:
    """
    Crea un pacchetto PING OpenBridge formattato con autenticazione HMAC.
    """
    # Header OpenBridge tipico: Magic 'OPB' (3 byte) + Tipo 0x01 (Ping) + PeerID (4 byte) + Timestamp (4 byte)
    timestamp = int(time.time())
    payload_base = struct.pack("!3sBI I", b"OPB", 0x01, peer_id, timestamp)
    
    # Calcoliamo la firma HMAC-SHA1 della password sul payload base
    firma_hmac = calcola_hmac(passphrase, payload_base)
    
    # Restituiamo il pacchetto completo (Payload + HMAC)
    return payload_base + firma_hmac

def crea_superheader_chiamata(peer_id: int, passphrase: str, src_id: int, dst_tg: int, slot: int, stream_id: bytes) -> bytes:
    """
    Crea l'intestazione di inizio trasmissione (Call Start / SuperHeader) per HBLink.
    """
    # Header: Magic 'OPB' + Tipo 0x80 (Start Call) + PeerID + StreamID + Slot + SrcID + DstTG
    # (Formato compatibile con le specifiche OpenBridge/HomeBrew)
    flags = (slot & 0x01) << 7
    payload_base = struct.pack("!3sB I 4s B I I", 
                               b"OPB", 0x80, peer_id, stream_id[:4], flags, src_id, dst_tg)
    
    firma_hmac = calcola_hmac(passphrase, payload_base)
    return payload_base + firma_hmac
