import socket
import struct
# import logging

# Setup logging
# logging.basicConfig(level=logging.DEBUG)

def create_magic_packet(mac_address):
    """Create a magic packet for the given MAC address."""

    # Remove any separation characters from the MAC address
    mac_address = mac_address.replace(":", "").replace("-", "")

    # Verify length of MAC address
    # if len(mac_address) != 12:
        # raise ValueError("Invalid MAC address format")

    # Create the magic packet by repeating the MAC address 16 times
    mac_bytes = bytes.fromhex(mac_address)
    magic_packet = b'\xff' * 6 + mac_bytes * 16

    return magic_packet

def send_magic_packet(mac_address, iface="eth0"):
    try:

        magic_packet = create_magic_packet(mac_address)

        # Create a raw socket
        sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
        # logging.debug(f"Binding to interface: {iface}")
        sock.bind((iface, 0))

        # Log the packet for debugging
        # logging.debug(f"Sending Magic Packet: {magic_packet.hex()} on interface {iface}")

        # Construct the Ethernet frame (magic packet)
        dest_mac = b'\xff\xff\xff\xff\xff\xff'  # Broadcast MAC address
        src_mac = sock.getsockname()[4]  # Source MAC address of the interface
        ether_type = struct.pack('!H', 0x0842)  # Wake-on-LAN
        frame = dest_mac + src_mac + ether_type + magic_packet

        # Send the Ethernet frame
        sock.send(frame)
        sock.close()
        # logging.debug(f"Magic packet sent to {mac_address} on interface {iface}")
    except Exception as e:
        logging.error(f"Failed to send WoL packet: {e}")

# Example usage
# send_magic_packet("mac goes here")
