# -*- coding: utf-8 -*-
# remover_usuario.py — otimizado para cPanel / hospedagens limitadas
# Remove um usuário do arquivo usuarios_centroides.npy com mínimo uso de CPU e memória

import os
import sys
import shutil

# ===============================
# 🔧 LIMITA THREADS E EVITA CONFLITOS DO NUMPY
# ===============================
os.environ.update({
    "OMP_NUM_THREADS": "1",           # OpenMP
    "OPENBLAS_NUM_THREADS": "1",      # OpenBLAS
    "MKL_NUM_THREADS": "1",           # Intel MKL
    "NUMEXPR_NUM_THREADS": "1",       # NumExpr
    "VECLIB_MAXIMUM_THREADS": "1",    # Apple vecLib (segurança)
    "BLIS_NUM_THREADS": "1",          # BLIS lib
    "OMP_WAIT_POLICY": "PASSIVE",
    "KMP_INIT_AT_FORK": "FALSE",
    "OPENBLAS_VERBOSE": "0"           # silencia logs de OpenBLAS
})

# Evita erro "PyCapsule_Import could not import module datetime"
if "datetime" in sys.modules:
    del sys.modules["datetime"]

# Desativa threads do OpenCV (caso esteja instalado)
try:
    import cv2
    cv2.setNumThreads(1)
except Exception:
    pass

# ===============================
# 🚀 IMPORTAÇÃO SEGURA DO NUMPY
# ===============================
try:
    import numpy as np
except ImportError as e:
    print(f"❌ Erro crítico ao importar NumPy: {e}")
    print("💡 Solução: execute dentro do virtualenv correto ou reinstale numpy==1.24.4")
    sys.exit(1)

# ===============================
# 🚀 INÍCIO DO SCRIPT
# ===============================
EMB_FILE = os.path.join("classifier", "usuarios_centroides.npy")

if not os.path.exists(EMB_FILE):
    print("❌ Arquivo usuarios_centroides.npy não encontrado.")
    sys.exit(1)

# Carrega o dicionário de forma segura
try:
    usuarios = np.load(EMB_FILE, allow_pickle=True).item()
except Exception as e:
    print(f"⚠️ Erro ao carregar o arquivo: {e}")
    sys.exit(1)

# ===============================
# 📋 LISTAGEM DE USUÁRIOS
# ===============================
if not isinstance(usuarios, dict) or len(usuarios) == 0:
    print("⚠️ Nenhum usuário encontrado no arquivo.")
    sys.exit(0)

print(f"📦 {len(usuarios)} usuários encontrados no arquivo.\n")
print("Usuários registrados:")
for i, nome in enumerate(sorted(usuarios.keys()), 1):
    print(f"  {i}. {nome}")

# ===============================
# 🧍 SELEÇÃO DO USUÁRIO
# ===============================
nome_remover = input("\nDigite o nome do usuário a remover (exato): ").strip().upper()

if nome_remover not in usuarios:
    print(f"⚠️ Usuário '{nome_remover}' não encontrado.")
    sys.exit(0)

confirm = input(f"Tem certeza que deseja remover '{nome_remover}'? (s/n): ").strip().lower()
if confirm != "s":
    print("❎ Operação cancelada.")
    sys.exit(0)

# ===============================
# 💾 BACKUP E REMOÇÃO SEGURA
# ===============================
try:
    backup_path = EMB_FILE + ".bak"
    shutil.copy(EMB_FILE, backup_path)
    print(f"💾 Backup criado: {backup_path}")
except Exception as e:
    print(f"⚠️ Falha ao criar backup: {e}")

# Remove o usuário
del usuarios[nome_remover]

# Salva alterações de forma segura
try:
    np.save(EMB_FILE, usuarios)
    print(f"✅ Usuário '{nome_remover}' removido com sucesso!")
    print(f"📁 Total restante: {len(usuarios)} usuários.")
except Exception as e:
    print(f"❌ Erro ao salvar alterações: {e}")
    sys.exit(1)

# ===============================
# 🧹 FINALIZAÇÃO OTIMIZADA
# ===============================
try:
    del usuarios
    import gc
    gc.collect()
    np.core.multiarray._multiarray_umath = None
except Exception:
    pass

print("🚀 Operação concluída com baixo consumo de recursos.")
