from lib.obter_configuracoes import obter_configuracoes
import sys
from lib.echo import echo
from lib.executar_validacoes_servidor_linux import executar_validacoes_servidor_linux
from lib.ClienteLinux import obter_cliente_linux
from lib.shared_network import garantir_shared_network, conectar_container_shared_network
from lib.nomes_containers import obter_nome_container_api_gateway
from lib.rede_externa import (
    deve_forcar_uso_rede_externa,
    obter_url_api_gateway_para_pesquisa_produto,
)
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\scriptsImplantacao' if len(sys.argv) < 3 else sys.argv[2]

configuracoes = obter_configuracoes(arquivo_configuracao)

if not configuracoes["acessos"]["servidorLinux"]["configurar"]:
    echo("Dados do servidor linux nao informados. Pesquisa e Produtos nao sera configurada")
    exit(0)

if not configuracoes["pesquisaProduto"]["configurar"]:
    echo("Configuracao da pesquisa de produto 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']

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

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

cliente_linux.executar_comando(f'mkdir -p /home/{usuario}/PesquisaProduto/nginx', echoar=False)
cliente_linux.copiar_arquivo(
    fr'{diretorio_scripts_implantacao}\pesquisaProduto\nginx\pesquisa-produto-proxy.conf',
    f'/home/{usuario}/PesquisaProduto/nginx/pesquisa-produto-proxy.conf'
)

API_GATEWAY_URL = obter_url_api_gateway_para_pesquisa_produto(configuracoes)

porta_proxy = configuracoes["pesquisaProduto"]["porta"] or "9986"

PORTA_PESQUISA_PRODUTO = porta_proxy

try:
    versao = preparar_versao_sistema(configuracoes, "pesquisaProduto", diretorio_scripts_implantacao)
except ErroVersaoSistema as erro:
    echo(str(erro), "error")
    exit(1)

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(fr"sed -i 's,\$PORTA_PESQUISA_PRODUTO,{PORTA_PESQUISA_PRODUTO},g' /home/{usuario}/PesquisaProduto/docker-compose.yml")
cliente_linux.executar_comando(fr"sed -i 's,\$URL_API_GATEWAY,{API_GATEWAY_URL},g' /home/{usuario}/PesquisaProduto/docker-compose.yml")
cliente_linux.executar_comando(fr"sed -i 's,\$VERSAO_PESQUISA_PRODUTO,{versao},g' /home/{usuario}/PesquisaProduto/docker-compose.yml")
cliente_linux.executar_comando(fr"sed -i 's,\$API_GATEWAY_URL,{API_GATEWAY_URL},g' /home/{usuario}/PesquisaProduto/nginx/pesquisa-produto-proxy.conf")

garantir_shared_network(cliente_linux)

if not deve_forcar_uso_rede_externa(configuracoes):
    conectar_container_shared_network(cliente_linux, obter_nome_container_api_gateway(configuracoes))

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

exit(0)
