"""0MQ Constants."""

# Copyright (c) PyZMQ Developers.
# Distributed under the terms of the Modified BSD License.

from zmq.backend import constants
from zmq.backend import has
from zmq.utils.constant_names import (
    base_names,
    switched_sockopt_names,
    socket_type_names,
    int_sockopt_names,
    int64_sockopt_names,
    bytes_sockopt_names,
    fd_sockopt_names,
    ctx_opt_names,
    msg_opt_names,
)

# -----------------------------------------------------------------------------
# Python module level constants
# -----------------------------------------------------------------------------


__all__ = [
    'int_sockopts',
    'int64_sockopts',
    'bytes_sockopts',
    'ctx_opts',
    'ctx_opt_names',
    'DRAFT_API',
]

if constants.VERSION < 40200:
    DRAFT_API = False
else:
    DRAFT_API = bool(has('draft') and constants.DRAFT_API)

int_sockopts = set()
int64_sockopts = set()
bytes_sockopts = set()
fd_sockopts = set()
ctx_opts = set()
msg_opts = set()
socket_types = dict()


if constants.VERSION < 30000:
    int64_sockopt_names.extend(switched_sockopt_names)
else:
    int_sockopt_names.extend(switched_sockopt_names)

_UNDEFINED = -9999


def _add_constant(name, container=None):
    """add a constant to be defined

    optionally add it to one of the sets for use in get/setopt checkers
    """
    c = getattr(constants, name, _UNDEFINED)
    if c == _UNDEFINED:
        return
    globals()[name] = c
    __all__.append(name)
    if container is not None:
        if isinstance(container, set):
            container.add(c)
        elif isinstance(container, dict):
            container[c] = name
    return c


for name in base_names:
    _add_constant(name)

for name in socket_type_names:
    _add_constant(name, socket_types)

for name in int_sockopt_names:
    _add_constant(name, int_sockopts)

for name in int64_sockopt_names:
    _add_constant(name, int64_sockopts)

for name in bytes_sockopt_names:
    _add_constant(name, bytes_sockopts)

for name in fd_sockopt_names:
    _add_constant(name, fd_sockopts)

for name in ctx_opt_names:
    _add_constant(name, ctx_opts)

for name in msg_opt_names:
    _add_constant(name, msg_opts)


# ensure some aliases are always defined
aliases = [
    ('DONTWAIT', 'NOBLOCK'),
    ('XREQ', 'DEALER'),
    ('XREP', 'ROUTER'),
]
for group in aliases:
    undefined = set()
    found = None
    for name in group:
        value = getattr(constants, name, -1)
        if value != -1:
            found = value
        else:
            undefined.add(name)
    if found is not None:
        for name in undefined:
            globals()[name] = found
            __all__.append(name)
