"""
A dummy package to allow wildcard import from brian2 without also importing
the pylab (numpy + matplotlib) namespace.

Usage: ``from brian2.only import *``

"""

# To minimize the problems with imports, import the packages in a sensible
# order

# isort:skip_file
# flake8: noqa

# The units and utils package does not depend on any other Brian package and
# should be imported first

from brian2.units import *
from brian2.utils import *
from brian2.core.tracking import *
from brian2.core.names import *
from brian2.core.spikesource import *

# The following packages only depend on something in the above set
from brian2.core.variables import linked_var
from brian2.core.functions import *
from brian2.core.preferences import *
from brian2.core.clocks import *
from brian2.equations import *

# The base class only depends on the above sets
from brian2.core.base import *

# The rest...
from brian2.core.network import *
from brian2.core.magic import *
from brian2.core.operations import *
from brian2.stateupdaters import *
from brian2.codegen import *
from brian2.core.namespace import *
from brian2.groups import *
from brian2.groups.subgroup import *
from brian2.synapses import *
from brian2.monitors import *
from brian2.importexport import *
from brian2.input import *
from brian2.spatialneuron import *
from brian2.devices import set_device, get_device, device, all_devices, seed
import brian2.devices.cpp_standalone as _cpp_standalone

# preferences
import brian2.core.core_preferences as _core_preferences

prefs.load_preferences()
prefs.do_validation()

prefs._backup()

set_device(all_devices["runtime"])


def restore_initial_state():
    """
    Restores internal Brian variables to the state they are in when Brian is imported

    Resets ``defaultclock.dt = 0.1*ms``,
    `BrianGlobalPreferences._restore` preferences, and set
    `BrianObject._scope_current_key` back to 0.
    """
    import gc

    prefs._restore()
    BrianObject._scope_current_key = 0
    defaultclock.dt = 0.1 * ms
    gc.collect()


# make the test suite available via brian2.test()
from brian2.tests import run as test

from brian2.units import __all__ as _all_units

__all__ = [
    "get_logger",
    "BrianLogger",
    "std_silent",
    "Trackable",
    "Nameable",
    "SpikeSource",
    "linked_var",
    "DEFAULT_FUNCTIONS",
    "Function",
    "implementation",
    "declare_types",
    "PreferenceError",
    "BrianPreference",
    "prefs",
    "brian_prefs",
    "Clock",
    "defaultclock",
    "Equations",
    "Expression",
    "Statements",
    "BrianObject",
    "BrianObjectException",
    "Network",
    "profiling_summary",
    "scheduling_summary",
    "MagicNetwork",
    "magic_network",
    "MagicError",
    "run",
    "stop",
    "collect",
    "store",
    "restore",
    "start_scope",
    "NetworkOperation",
    "network_operation",
    "StateUpdateMethod",
    "linear",
    "exact",
    "independent",
    "milstein",
    "heun",
    "euler",
    "rk2",
    "rk4",
    "ExplicitStateUpdater",
    "exponential_euler",
    "gsl_rk2",
    "gsl_rk4",
    "gsl_rkf45",
    "gsl_rkck",
    "gsl_rk8pd",
    "NumpyCodeObject",
    "CythonCodeObject",
    "get_local_namespace",
    "DEFAULT_FUNCTIONS",
    "DEFAULT_UNITS",
    "DEFAULT_CONSTANTS",
    "CodeRunner",
    "Group",
    "VariableOwner",
    "NeuronGroup",
    "Subgroup",
    "Synapses",
    "SpikeMonitor",
    "EventMonitor",
    "StateMonitor",
    "PopulationRateMonitor",
    "ImportExport",
    "BinomialFunction",
    "PoissonGroup",
    "PoissonInput",
    "SpikeGeneratorGroup",
    "TimedArray",
    "Morphology",
    "Soma",
    "Cylinder",
    "Section",
    "SpatialNeuron",
    "set_device",
    "get_device",
    "device",
    "all_devices",
    "seed",
    "restore_initial_state",
    "test",
]
__all__.extend(_all_units)
