import os

from lib.backup_volume import fazer_backup_volume_docker, restaurar_backup_volume_docker
from lib.nomes_containers import obter_nome_container_mu_whatsapp
from lib.shared_network import garantir_shared_network, desconectar_container_shared_network


VOLUMES_MU_WHATSAPP_API = (
    "muwhatsapp_tokens",
    "muwhatsapp_user_data",
)


def obter_diretorio_remoto_mu_whatsapp_api(configuracoes):
    usuario = configuracoes["acessos"]["servidorLinux"]["usuario"]
    return f"/home/{usuario}/muWhatsapp"


def obter_caminho_compose_remoto_mu_whatsapp_api(configuracoes):
    return f"{obter_diretorio_remoto_mu_whatsapp_api(configuracoes)}/docker-compose.yml"


def obter_caminho_compose_local_mu_whatsapp_api(diretorio_scripts_implantacao):
    return os.path.join(
        diretorio_scripts_implantacao,
        "muWhatsapp",
        "docker-compose-mu-whatsapp.yml"
    )


def preparar_ambiente_mu_whatsapp_api(
    cliente_linux,
    configuracoes,
    diretorio_scripts_implantacao,
    versao=None
):
    """
    Prepara o compose remoto do MuWhatsapp.

    `versao` permite informar a tag ja resolvida e validada pelo chamador (ver
    lib/versoes_sistemas.py). Quando nao informada, usa a versao crua do YAML.
    """

    diretorio_remoto = obter_diretorio_remoto_mu_whatsapp_api(configuracoes)
    caminho_compose_remoto = obter_caminho_compose_remoto_mu_whatsapp_api(configuracoes)
    caminho_compose_local = obter_caminho_compose_local_mu_whatsapp_api(diretorio_scripts_implantacao)

    versao = versao if versao else configuracoes["muWhatsapp"]["versao"]
    porta = configuracoes["muWhatsapp"]["porta"]
    nome_container_mu_whatsapp = obter_nome_container_mu_whatsapp(configuracoes)

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

    cliente_linux.executar_comando(f"mkdir -p {diretorio_remoto}")
    cliente_linux.copiar_arquivo(caminho_compose_local, caminho_compose_remoto)
    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,\$VERSAO_MU_WHATSAPP,{versao},g' {caminho_compose_remoto}"
    )
    cliente_linux.executar_comando(
        fr"sed -i 's,\$PORTA,{porta},g' {caminho_compose_remoto}"
    )
    cliente_linux.executar_comando(
        fr"sed -i 's,\$NOME_CONTAINER_MU_WHATSAPP,{nome_container_mu_whatsapp},g' {caminho_compose_remoto}"
    )

    return caminho_compose_remoto


def subir_mu_whatsapp_api(
    cliente_linux,
    configuracoes,
    diretorio_scripts_implantacao=None,
    preparar_ambiente=True,
    versao=None
):
    caminho_compose = (
        preparar_ambiente_mu_whatsapp_api(
            cliente_linux,
            configuracoes,
            diretorio_scripts_implantacao,
            versao=versao
        )
        if preparar_ambiente
        else obter_caminho_compose_remoto_mu_whatsapp_api(configuracoes)
    )

    garantir_shared_network(cliente_linux)
    cliente_linux.executar_comando(f"docker compose -f {caminho_compose} up -d")


def recriar_mu_whatsapp_api(cliente_linux, configuracoes, diretorio_scripts_implantacao, versao=None):
    caminho_compose = preparar_ambiente_mu_whatsapp_api(
        cliente_linux,
        configuracoes,
        diretorio_scripts_implantacao,
        versao=versao
    )

    garantir_shared_network(cliente_linux)
    cliente_linux.executar_comando(f"docker compose -f {caminho_compose} down")
    cliente_linux.executar_comando(f"docker compose -f {caminho_compose} up -d")


def criar_volumes_mu_whatsapp_api(cliente_linux):
    for volume in VOLUMES_MU_WHATSAPP_API:
        cliente_linux.executar_comando(f"docker volume create {volume}")


def fazer_backup_volumes_mu_whatsapp_api(arquivo_configuracao):
    for volume in VOLUMES_MU_WHATSAPP_API:
        fazer_backup_volume_docker(volume, arquivo_configuracao)


def restaurar_backup_volumes_mu_whatsapp_api(arquivo_configuracao):
    for volume in VOLUMES_MU_WHATSAPP_API:
        restaurar_backup_volume_docker(volume, arquivo_configuracao)


def apagar_mu_whatsapp_api(cliente_linux, configuracoes, remover_volumes=True):
    nome_container_mu_whatsapp = obter_nome_container_mu_whatsapp(configuracoes)
    caminho_compose = obter_caminho_compose_remoto_mu_whatsapp_api(configuracoes)
    diretorio_remoto = obter_diretorio_remoto_mu_whatsapp_api(configuracoes)
    flag_volumes = " -v" if remover_volumes else ""

    desconectar_container_shared_network(cliente_linux, nome_container_mu_whatsapp)

    cliente_linux.executar_comando(
        f"docker compose -f {caminho_compose} down --remove-orphans{flag_volumes}",
        disparar_excecao_se_retorno_nao_zero=False
    )
    cliente_linux.executar_comando(
        f"docker rm -f {nome_container_mu_whatsapp}",
        disparar_excecao_se_retorno_nao_zero=False
    )

    if remover_volumes:
        for volume in VOLUMES_MU_WHATSAPP_API:
            cliente_linux.executar_comando(
                f"docker volume rm -f {volume}",
                disparar_excecao_se_retorno_nao_zero=False
            )

    cliente_linux.executar_comando(
        f"rm -rf {diretorio_remoto}",
        disparar_excecao_se_retorno_nao_zero=False
    )
