"""
Config can be passed to :py:class:`netlab.async_client.NetlabClient` using environment variables,
using a json file on your system, or by passing a ``dict`` explicitly.
"""


from typing import Optional
from typing_extensions import TypedDict


class NetlabServerConfig(TypedDict):
    """
    Passed to `netlab.async_client.NetlabClient` to configure the connection
    to a server.

    **Example**

    ::

        config = {
            "host": "192.168.1.10",
            "user": "administrator",
            "token": "S25GWP5P2247CMRDNLTCNKATT49KSGEDDPXMTM6A",
            "port": 9000,
            "timeout": 10
        }

        async with NetlabClient(config=config) as client:
            ...
    """
    host: str
    "IP Address or hostname of remote NETLAB+ API."
    user: str
    "User account username from NETLAB+ system. Usually ``'administrator'``."
    token: str
    "Token obtained from NETLAB+ system."
    port: int
    "Port of remote NETLAB+ API. Usually ``9000``."
    timeout: int
    "The amount of time in seconds of no response from the socket before it will close. Defaults to ``10``."
    server_hostname: Optional[str]
    "The hostname that ssl is configured to use. Only required if it is diffrent from 'host'."
    ssl: bool
    "Use ssl when connecting to NETLAB+"
    message_byte_limit: int
    "The maximum size of a NETLAB+ message."


class NetlabServerEnvConfig(TypedDict, total=True):
    """
    Each of the above configuration options can be specified as environment variables.
    """
    NETLAB_CONFIG: str
    "Folder which contains the 'config.json'."
    NETLAB_CONFIG_HOST: str
    "IP Address or hostname of remote NETLAB+ API."
    NETLAB_CONFIG_USER: str
    "User account ID from NETLAB+ system."
    NETLAB_CONFIG_TOKEN: str
    "Token obtained from NETLAB+ system."
    NETLAB_CONFIG_PORT: str
    "Port of remote NETLAB+ API."
    NETLAB_CONFIG_TIMEOUT: str
    "The amount of time in seconds of no response from the socket before it will close."
