import logging
import socket

from zeroconf import (
    ServiceInfo,
    NonUniqueNameException,
    InterfaceChoice,
    IPVersion,
    Zeroconf,
)

logger = logging.getLogger(__name__)

ZEROCONF_TYPE = "_frigate._tcp.local."

# Taken from: http://stackoverflow.com/a/11735897
def get_local_ip() -> bytes:
    """Try to determine the local IP address of the machine."""
    host_ip_str = ""
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

        # Use Google Public DNS server to determine own IP
        sock.connect(("8.8.8.8", 80))

        host_ip_str = sock.getsockname()[0]
    except OSError:
        try:
            host_ip_str = socket.gethostbyname(socket.gethostname())
        except socket.gaierror:
            host_ip_str = "127.0.0.1"
    finally:
        sock.close()

    try:
        host_ip_pton = socket.inet_pton(socket.AF_INET, host_ip_str)
    except OSError:
        host_ip_pton = socket.inet_pton(socket.AF_INET6, host_ip_str)

    return host_ip_pton


def broadcast_zeroconf(frigate_id: str) -> Zeroconf:
    zeroconf = Zeroconf(interfaces=InterfaceChoice.Default, ip_version=IPVersion.V4Only)

    host_ip = get_local_ip()

    info = ServiceInfo(
        ZEROCONF_TYPE,
        name=f"{frigate_id}.{ZEROCONF_TYPE}",
        addresses=[host_ip],
        port=5000,
    )

    logger.info("Starting Zeroconf broadcast")
    try:
        zeroconf.register_service(info)
    except NonUniqueNameException:
        logger.error(
            "Frigate instance with identical name present in the local network"
        )
    return zeroconf