import sys
from lib.echo import echo
from lib.ClienteLinux import obter_cliente_linux
from lib.obter_configuracoes import obter_configuracoes
from lib.executar_validacoes_servidor_linux import executar_validacoes_servidor_linux
from lib.shared_network import garantir_shared_network
from lib.nomes_containers import (
    obter_nome_container_configurar_microkafka,
    obter_nome_container_microkafka,
    obter_nome_container_microkafka_ui,
    obter_nome_container_zookeeper,
)
from lib.substituir_placeholders import substituir_placeholders_arquivo
from lib.versoes_sistemas import ErroVersaoSistema, preparar_versao_sistema

arquivo_configuracao = None if len(sys.argv) < 2 else sys.argv[1]
diretorio_scripts_implantacao = r'c:\microuniversoWeb\scripts_implantacao' if len(sys.argv) < 3 else sys.argv[2]

configuracoes = obter_configuracoes(arquivo_configuracao)

if not configuracoes:
    echo(f"Falha ao carregar configuracoes do arquivo {arquivo_configuracao}", "error")
    exit(1)

if not configuracoes["acessos"]["servidorLinux"]["configurar"]:
    echo("Dados do servidor linux nao informados. Microkafka nao sera configurado")
    exit(0)

if not configuracoes["microkafka"]["configurar"]:
    echo("Configuracao do Microkafka desativada via configuracao")
    exit(0)

mensagem_erro = executar_validacoes_servidor_linux(arquivo_configuracao, diretorio_scripts_implantacao)

if mensagem_erro:
    echo(mensagem_erro, "error")
    exit(1)

cliente_linux = obter_cliente_linux(arquivo_configuracao)

usuario = configuracoes['acessos']['servidorLinux']['usuario']
usuario_registro_docker = configuracoes["acessos"]["registroDocker"]["usuario"]
senha_registro_docker = configuracoes["acessos"]["registroDocker"]["senha"]

cliente_linux.executar_comando(
    fr'docker login gitlab.microuniverso.com.br:5050 -u {usuario_registro_docker} -p {senha_registro_docker}',
    disparar_excecao_se_retorno_nao_zero=False
)

cliente_linux.executar_comando(f'mkdir -p /home/{usuario}/microkafka')

cliente_linux.copiar_arquivo(fr'{diretorio_scripts_implantacao}\microkafka\docker-compose-microkafka.yml', f'/home/{usuario}/microkafka/docker-compose.yml')

try:
    versao_microkafka = preparar_versao_sistema(configuracoes, "microkafka", diretorio_scripts_implantacao)
    versao_configurar_microkafka = preparar_versao_sistema(configuracoes, "microkafkaConfigurador", diretorio_scripts_implantacao)
except ErroVersaoSistema as erro:
    echo(str(erro), "error")
    exit(1)

host_microkafka = configuracoes["acessos"]["servidorLinux"]["host"]
porta_microkafka_ui = configuracoes["microkafka"]["portaMicrokafkaUI"]
nome_container_zookeeper = obter_nome_container_zookeeper(configuracoes)
nome_container_microkafka = obter_nome_container_microkafka(configuracoes)
nome_container_configurar_microkafka = obter_nome_container_configurar_microkafka(configuracoes)
nome_container_microkafka_ui = obter_nome_container_microkafka_ui(configuracoes)

substituir_placeholders_arquivo(
    cliente_linux,
    f"/home/{usuario}/microkafka/docker-compose.yml",
    {
        r"\$TAG_MICROKAFKA": versao_microkafka,
        r"\$TAG_CONFIGURAR_MICROKAFKA": versao_configurar_microkafka,
        r"\$MICROKAFKA_HOST": host_microkafka,
        r"\$PORTA_MICROKAFKA_UI": porta_microkafka_ui,
        r"\$NOME_CONTAINER_ZOOKEEPER": nome_container_zookeeper,
        r"\$NOME_CONTAINER_MICROKAFKA": nome_container_microkafka,
        r"\$NOME_CONTAINER_CONFIGURAR_MICROKAFKA": nome_container_configurar_microkafka,
        r"\$NOME_CONTAINER_MICROKAFKA_UI": nome_container_microkafka_ui,
    }
)

garantir_shared_network(cliente_linux)

cliente_linux.executar_comando(fr'docker compose -f /home/{usuario}/microkafka/docker-compose.yml down')
cliente_linux.executar_comando(fr'docker compose -f /home/{usuario}/microkafka/docker-compose.yml pull')
cliente_linux.executar_comando(fr'docker compose -f /home/{usuario}/microkafka/docker-compose.yml up -d')

exit(0)
