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.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. Site de Configuracao Web nao sera configurado")
    exit(0)

if not configuracoes["muWhatsapp"]["configurarApi"]:
    echo("Site de Configuracao Web 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}/ConfiguracoesWeb')

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

url_api_enterprise = "{protocolo}://{host}:{porta}".format(
    protocolo="http",
    host= configuracoes['acessos']['servidorLinux']['host'],
    porta=configuracoes["enterprise"]["porta"]
)


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

porta = configuracoes["configuracoesWeb"]["porta"]

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,\$URL_API_ENTERPRISE,{url_api_enterprise},g' /home/{usuario}/ConfiguracoesWeb/docker-compose.yml")

cliente_linux.executar_comando(fr"sed -i 's,\$VERSAO_CONFIGURACOES_WEB,{versao},g' /home/{usuario}/ConfiguracoesWeb/docker-compose.yml")
cliente_linux.executar_comando(fr"sed -i 's,\$PORTA,{porta},g' /home/{usuario}/ConfiguracoesWeb/docker-compose.yml")
cliente_linux.executar_comando(fr"sed -i 's,\$VERSAO_MU_WHATSAPP_API,{versao_mu_whatsapp_api},g' /home/{usuario}/ConfiguracoesWeb/docker-compose.yml")

caminho_compose = f'/home/{usuario}/ConfiguracoesWeb/docker-compose.yml'

# `--remove-orphans` derruba container que saiu do compose e ficaria rodando
# sozinho, sem ninguem gerenciar.
cliente_linux.executar_comando(f'docker compose -f {caminho_compose} down --remove-orphans')

# O `pull` explicito e o que resolve o cache de imagem, e nao e opcional.
#
# Com tag mutavel -- `latest`, `master` ou nome de branch reaproveitado -- o
# `docker compose up -d` NAO vai ao registro se ja existe imagem local com aquela
# tag. Ele sobe a copia antiga, e a implantacao termina com "sucesso" rodando
# codigo velho. Foi o problema relatado em campo.
#
# Deixa estourar em caso de falha, de proposito: se o registro esta inacessivel, e
# melhor a implantacao parar com erro visivel do que seguir e subir a imagem antiga
# em silencio -- que e exatamente o defeito que este pull veio corrigir. A
# existencia da tag no registro ja foi validada antes por `preparar_versao_sistema`.
cliente_linux.executar_comando(f'docker compose -f {caminho_compose} pull')

# `--force-recreate` porque, com a mesma tag, o compose considera o container
# atualizado e nao o recria -- mesmo depois de o pull ter trazido imagem nova.
cliente_linux.executar_comando(f'docker compose -f {caminho_compose} up -d --force-recreate')

exit(0)

