import subprocess
import threading
import time
import sys

class Cores:
    """Classe para definir cores para saída no terminal."""
    VERDE_OK = '\033[92m'
    AVISO = '\033[93m'
    ERRO = '\033[91m'
    INFO = '\033[96m'
    FIM = '\033[0m'


def ask_user(prompt):
    """Ask the user a yes/no question and return True/False."""
    try:
        resposta = input(f"{prompt} (sim/não): ")
        return resposta.lower() in ['sim', 's']
    except KeyboardInterrupt:
        print("\nProcesso interrompido pelo utilizador.")
        sys.exit(0)


def run_command(command, docker_path):
    try:
        print(f"{Cores.VERDE_OK}A executar: {command}{Cores.FIM}")

        process = subprocess.Popen(
            command,
            shell=True,
            cwd=docker_path,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            text=True,
            bufsize=1
        )

        for line in process.stdout:
            print(line, end='')  # print as it comes (Laravel progress updates)

        process.wait()

        if process.returncode != 0:
            print(f"{Cores.ERRO}Comando retornou código {process.returncode}{Cores.FIM}")
            return False

        print()
        return True

    except Exception as e:
        print(f"{Cores.ERRO}Erro ao executar o comando: {e}{Cores.FIM}")
        return False

def generate_translations(docker_path):
    """Executa o comando para escolher linguagens automáticas."""
    print(f"\n{Cores.VERDE_OK}Executando comando Artisan: translations:choose-languages{Cores.FIM}")
    command = "docker compose exec backoffice-marketplace php artisan app:choose-automatic-translations"
    return run_command(command, docker_path)


def list_languages(docker_path):
    """
    Retorna uma lista de linguagens disponíveis a partir do comando Artisan.
    """
    command = "docker compose exec -T backoffice-marketplace php artisan app:list-available-languages"

    try:
        # Run command
        result = subprocess.run(
            command,
            shell=True,
            cwd=str(docker_path),
            capture_output=True,
            text=True
        )

        if result.stderr:
            print(f"{Cores.AVISO}{result.stderr}{Cores.FIM}")

        # Clean and filter lines
        lines = [line.strip() for line in result.stdout.strip().split("\n") if line.strip()]
        lines = [line for line in lines if not line.lower().startswith("available")]

        return lines

    except Exception as e:
        print(f"{Cores.ERRO}Falha ao listar linguagens: {e}{Cores.FIM}")
        return []



def select_language(languages):
    """
    Pergunta ao utilizador qual linguagem deseja traduzir.
    """
    if not languages:
        print(f"{Cores.AVISO}Nenhuma linguagem disponível para tradução.{Cores.FIM}")
        return None

    print(f"\n{Cores.INFO}Escolha uma linguagem para tradução automática:{Cores.FIM}")
    for idx, lang in enumerate(languages, start=1):
        print(f"{idx}. {lang}")

    while True:
        choice = input("Digite o número correspondente à linguagem desejada: ").strip()
        if choice.isdigit():
            choice = int(choice)
            if 1 <= choice <= len(languages):
                return languages[choice - 1]

        print("Escolha inválida. Tente novamente.")


def translate_language(docker_path, chosen_lang):
    """
    Executa o comando Artisan para traduzir automaticamente o conteúdo.
    """
    print(f"\n{Cores.VERDE_OK}Traduzindo conteúdo automaticamente para {chosen_lang}...{Cores.FIM}")
    command = f"docker compose exec -T backoffice-marketplace php artisan app:auto-translate-language {chosen_lang}"
    return run_command(command, docker_path)
