"""Initialize CyberBattleSim module"""
from gymnasium.envs.registration import registry, EnvSpec
from gymnasium.error import Error
from . import simulation
from . import agents
from ._env.cyberbattle_env import AttackerGoal, DefenderGoal
from .samples.chainpattern import chainpattern
from .samples.toyctf import toy_ctf
from .samples.active_directory import generate_ad
from .simulation import generate_network, model
__all__ = (
    "simulation",
    "agents",
)
def register(id: str, cyberbattle_env_identifiers: model.Identifiers, **kwargs):
    """same as gym.envs.registry.register, but adds CyberBattle specs to env.spec"""
    if id in registry:
        raise Error("Cannot re-register id: {}".format(id))
    spec = EnvSpec(id, **kwargs)
    registry[id] = spec
if "CyberBattleToyCtf-v0" in registry:
    del registry["CyberBattleToyCtf-v0"]
register(
    id="CyberBattleToyCtf-v0",
    cyberbattle_env_identifiers=toy_ctf.ENV_IDENTIFIERS,
    entry_point="cyberbattle._env.cyberbattle_toyctf:CyberBattleToyCtf",
    kwargs={"defender_agent": None, "attacker_goal": AttackerGoal(own_atleast=6), "defender_goal": DefenderGoal(eviction=True)},
    
)
if "CyberBattleTiny-v0" in registry:
    del registry["CyberBattleTiny-v0"]
register(
    id="CyberBattleTiny-v0",
    cyberbattle_env_identifiers=toy_ctf.ENV_IDENTIFIERS,
    entry_point="cyberbattle._env.cyberbattle_tiny:CyberBattleTiny",
    kwargs={"defender_agent": None, "attacker_goal": AttackerGoal(own_atleast=6), "defender_goal": DefenderGoal(eviction=True), "maximum_total_credentials": 10, "maximum_node_count": 10},
    
)
if "CyberBattleRandom-v0" in registry:
    del registry["CyberBattleRandom-v0"]
register(
    id="CyberBattleRandom-v0",
    cyberbattle_env_identifiers=generate_network.ENV_IDENTIFIERS,
    entry_point="cyberbattle._env.cyberbattle_random:CyberBattleRandom",
)
if "CyberBattleChain-v0" in registry:
    del registry["CyberBattleChain-v0"]
register(
    id="CyberBattleChain-v0",
    cyberbattle_env_identifiers=chainpattern.ENV_IDENTIFIERS,
    entry_point="cyberbattle._env.cyberbattle_chain:CyberBattleChain",
    kwargs={"size": 4, "defender_agent": None, "attacker_goal": AttackerGoal(own_atleast_percent=1.0), "defender_goal": DefenderGoal(eviction=True), "winning_reward": 5000.0, "losing_reward": 0.0},
    reward_threshold=2200,
)
ad_envs = [f"ActiveDirectory-v{i}" for i in range(0, 10)]
for index, env in enumerate(ad_envs):
    if env in registry:
        del registry[env]
    register(
        id=env,
        cyberbattle_env_identifiers=generate_ad.ENV_IDENTIFIERS,
        entry_point="cyberbattle._env.active_directory:CyberBattleActiveDirectory",
        kwargs={
            "seed": index,
            "maximum_discoverable_credentials_per_action": 50000,
            "maximum_node_count": 30,
            "maximum_total_credentials": 50000,
        },
    )
if "ActiveDirectoryTiny-v0" in registry:
    del registry["ActiveDirectoryTiny-v0"]
register(
    id="ActiveDirectoryTiny-v0",
    cyberbattle_env_identifiers=chainpattern.ENV_IDENTIFIERS,
    entry_point="cyberbattle._env.active_directory:CyberBattleActiveDirectoryTiny",
    kwargs={"maximum_discoverable_credentials_per_action": 50000, "maximum_node_count": 30, "maximum_total_credentials": 50000},
)