import sys
from pathlib import Path

from lib.ClienteLinux import obter_cliente_linux
from lib.echo import echo
from lib.executar_validacoes_servidor_linux import executar_validacoes_servidor_linux
from lib.mu_whatsapp_api import apagar_mu_whatsapp_api
from lib.nomes_containers import obter_nome_container_mu_whatsapp
from lib.obter_configuracoes import obter_configuracoes


PADRAO_RECURSOS_MU_WHATSAPP = "muwhatsapp"


def remover_recursos_por_padrao(cliente_linux, padrao):
    comandos = [
        (
            "containers",
            f"docker ps -a --format '{{{{.Names}}}}' | grep -i '{padrao}' | xargs -r docker rm -f",
        ),
        (
            "volumes",
            f"docker volume ls --format '{{{{.Name}}}}' | grep -i '{padrao}' | xargs -r docker volume rm -f",
        ),
        (
            "imagens",
            f"docker images --format '{{{{.Repository}}}}:{{{{.Tag}}}}' | grep -i '{padrao}' | xargs -r docker rmi -f",
        ),
    ]

    for tipo_recurso, comando in comandos:
        echo(f"Removendo {tipo_recurso} cujo nome contenha '{padrao}'")
        cliente_linux.executar_comando(
            comando,
            disparar_excecao_se_retorno_nao_zero=False
        )


arquivo_configuracao = None if len(sys.argv) < 2 else sys.argv[1]
diretorio_scripts_implantacao = str(Path(__file__).resolve().parents[1]) 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. Hard reset da MuWhatsapp API nao sera executado")
    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)

echo("Tentando parada limpa via docker compose e remocao dos volumes mapeados")
apagar_mu_whatsapp_api(cliente_linux, configuracoes, remover_volumes=True)

nome_container = obter_nome_container_mu_whatsapp(configuracoes)
echo(f"Removendo container '{nome_container}' (forcado, por nome)")
cliente_linux.executar_comando(
    f"docker rm -f {nome_container}",
    disparar_excecao_se_retorno_nao_zero=False
)

echo("Removendo nominalmente todos os recursos remanescentes que casem com o padrao do MuWhatsapp")
remover_recursos_por_padrao(cliente_linux, PADRAO_RECURSOS_MU_WHATSAPP)

echo("Executando docker system prune (removendo containers parados, redes, imagens e volumes nao utilizados)")
cliente_linux.executar_comando(
    "docker system prune -af --volumes",
    disparar_excecao_se_retorno_nao_zero=False
)

echo("Hard reset da MuWhatsapp API concluido")
exit(0)
