import json


SHARED_NETWORK = "shared_net"


def garantir_shared_network(cliente_linux, nome_rede=SHARED_NETWORK):
    cliente_linux.executar_comando(
        f"docker network inspect {nome_rede} >/dev/null 2>&1 || docker network create {nome_rede}"
    )


def container_existe(cliente_linux, nome_container):
    return cliente_linux.executar_comando(
        f"docker inspect {nome_container} >/dev/null 2>&1",
        disparar_excecao_se_retorno_nao_zero=False,
        echoar=False
    ).codigo_retorno == 0


def conectar_container_shared_network(
    cliente_linux,
    nome_container,
    reiniciar_apos_conexao=False,
    nome_rede=SHARED_NETWORK
):
    if not container_existe(cliente_linux, nome_container):
        return False

    cliente_linux.executar_comando(
        f"docker network connect {nome_rede} {nome_container}",
        disparar_excecao_se_retorno_nao_zero=False,
        echoar=False
    )

    if reiniciar_apos_conexao:
        cliente_linux.executar_comando(
            f"docker restart {nome_container}",
            echoar=False
        )

    return True


def desconectar_container_shared_network(cliente_linux, nome_container, nome_rede=SHARED_NETWORK):
    if not container_existe(cliente_linux, nome_container):
        return False

    cliente_linux.executar_comando(
        f"docker network disconnect {nome_rede} {nome_container}",
        disparar_excecao_se_retorno_nao_zero=False,
        echoar=False
    )

    return True


def obter_ip_container_shared_network(cliente_linux, nome_container, nome_rede=SHARED_NETWORK):
    if not container_existe(cliente_linux, nome_container):
        return None

    resultado = cliente_linux.executar_comando(
        f"docker inspect {nome_container} --format '{{{{json .NetworkSettings.Networks}}}}'",
        disparar_excecao_se_retorno_nao_zero=False,
        echoar=False
    )

    if resultado.codigo_retorno != 0:
        return None

    saida = resultado.saida.strip()

    if not saida:
        return None

    try:
        redes = json.loads(saida)
    except json.JSONDecodeError:
        return None

    dados_rede = redes.get(nome_rede)

    if not dados_rede:
        return None

    return dados_rede.get("IPAddress") or None
