import subprocess
import os
import sys
import signal
import threading
import time
from pathlib import Path

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 mostrar_spinner(mensagem, evento_concluido):
    """
    Mostra um spinner de carregamento na linha de comando.
    """
    spinner = ['|', '/', '-', '\\']
    idx = 0
    while not evento_concluido.is_set():
        print(f"\r{Cores.INFO}{mensagem} {spinner[idx]}{Cores.FIM}", end='', flush=True)
        idx = (idx + 1) % len(spinner)
        time.sleep(0.1)
    print("\r" + " " * (len(mensagem) + 2), end='\r')

def run_script(script_name):
    """Executa um script Python."""
    try:
        print(f"{Cores.VERDE_OK}A executar: {script_name}{Cores.FIM}")
        evento_concluido = threading.Event()
        spinner_thread = threading.Thread(target=mostrar_spinner, args=("A processar...", evento_concluido))
        spinner_thread.start()
        
        result = subprocess.run(f"python {script_name}", shell=True, capture_output=True, text=True)
        
        evento_concluido.set()
        spinner_thread.join()
        
        print("\r" + " " * 20, end='\r')  # Limpa a linha do spinner
        
        if result.stdout:
            print(result.stdout)
        if result.stderr:
            print(f"{Cores.AVISO}{result.stderr}{Cores.FIM}")
        return result.returncode == 0
    except Exception as e:
        evento_concluido.set()
        spinner_thread.join()
        print(f"{Cores.ERRO}Erro ao executar o script: {e}{Cores.FIM}")
        return False

def confirm_action():
    """Solicita confirmação do usuário para continuar com a ação."""
    try:
        print(f"{Cores.ERRO}Esta ação irá limpar todos os dados das tabelas de forma irreversível.{Cores.FIM}")
        resposta = input(f"{Cores.ERRO}Tem a certeza que deseja continuar? (sim/não): {Cores.FIM}")
        return resposta.lower() in ['sim', 's']
    except KeyboardInterrupt:
        print(f"\n{Cores.AVISO}Processo interrompido pelo utilizador.{Cores.FIM}")
        sys.exit(0)

def handle_interrupt(signal_received, frame):
    """Manipulador de sinal para interrupções."""
    print(f"\n{Cores.AVISO}Processo interrompido pelo utilizador.{Cores.FIM}")
    sys.exit(0)

def main():
    """Função principal que coordena a execução dos scripts de reset, migração e seed."""
    signal.signal(signal.SIGINT, handle_interrupt)
    signal.signal(signal.SIGTERM, handle_interrupt)

    if not confirm_action():
        print(f"{Cores.AVISO}Ação cancelada pelo utilizador.{Cores.FIM}")
        sys.exit(0)

    if run_script("reset_migrations.py"):
        if run_script("run_migrations.py"):
            if run_script("run_seeders.py"):
                print(f"{Cores.VERDE_OK}Todas as operações foram executadas com sucesso!{Cores.FIM}")
            else:
                print(f"{Cores.ERRO}Erro ao executar seeders.{Cores.FIM}")
        else:
            print(f"{Cores.ERRO}Erro ao executar migrações.{Cores.FIM}")
    else:
        print(f"{Cores.ERRO}Erro ao resetar migrações.{Cores.FIM}")

if __name__ == "__main__":
    main()
