#!/usr/bin/env python3
"""
╔════════════════════════════════════════════════════════════════════════════╗
║                    MONITOR DE POOLS - VISUAL                               ║
╚════════════════════════════════════════════════════════════════════════════╝

Mostra o status de todos os pools em tempo real.
"""

import os
import sys
import time
import json
import urllib.request

SERVER_URL = "http://127.0.0.1:8888"
REFRESH_INTERVAL = 2  # segundos

def clear_screen():
    os.system('clear' if os.name != 'nt' else 'cls')

def get_stats():
    try:
        req = urllib.request.Request(f"{SERVER_URL}/stats")
        with urllib.request.urlopen(req, timeout=5) as response:
            return json.loads(response.read().decode())
    except:
        return None

def get_folders():
    try:
        req = urllib.request.Request(f"{SERVER_URL}/folders")
        with urllib.request.urlopen(req, timeout=5) as response:
            return json.loads(response.read().decode())
    except:
        return None

def progress_bar(current, total, width=40):
    """Cria barra de progresso visual"""
    if total == 0:
        return "[" + " " * width + "]"
    
    filled = int(width * current / total)
    bar = "█" * filled + "░" * (width - filled)
    percent = (current / total) * 100
    return f"[{bar}] {percent:5.1f}%"

def get_status_emoji(current, total):
    """Retorna emoji baseado no status"""
    if total == 0:
        return "⏳"
    percent = (current / total) * 100
    if percent >= 100:
        return "✅"
    elif percent >= 75:
        return "🟢"
    elif percent >= 50:
        return "🟡"
    elif percent >= 25:
        return "🟠"
    else:
        return "🔴"

def monitor():
    """Loop principal de monitoramento"""
    
    # Tentar obter config do servidor
    stats = get_stats()
    if not stats:
        print("❌ Servidor não está respondendo!")
        print(f"   Verifique se está rodando em {SERVER_URL}")
        return
    
    # Determinar tamanho do pool (tentar extrair da resposta ou usar padrão)
    pool_max = 100  # Padrão
    
    while True:
        clear_screen()
        
        stats = get_stats()
        folders = get_folders()
        
        print()
        print("╔════════════════════════════════════════════════════════════════════════════╗")
        print("║                    📊 MONITOR DE POOLS - TEMPO REAL                        ║")
        print("╚════════════════════════════════════════════════════════════════════════════╝")
        print()
        
        if not stats or not folders:
            print("  ⚠️  Aguardando conexão com servidor...")
            time.sleep(REFRESH_INTERVAL)
            continue
        
        # Info do servidor
        print(f"  🖥️  Servidor: {SERVER_URL}")
        print(f"  ⏱️  Uptime: {stats.get('uptime', 'N/A')}")
        print(f"  ⚡ AES Rápido: {'✅ Sim' if stats.get('aes_fast') else '❌ Não'}")
        print()
        
        # Estatísticas gerais
        pool_stats = stats.get('pool', {})
        print("  ─────────────────────────────────────────────────────────────────────────")
        print(f"  📈 Estatísticas:")
        print(f"      Total gerados: {pool_stats.get('generated', 0):,}")
        print(f"      Servidos do pool: {pool_stats.get('served_from_pool', 0):,}")
        print(f"      Gerados na hora: {pool_stats.get('served_generated', 0):,}")
        print(f"      Fila de geração: {pool_stats.get('queue_size', 0):,}")
        print()
        
        # Status por pasta
        print("  ─────────────────────────────────────────────────────────────────────────")
        print("  📁 STATUS DOS POOLS POR PASTA:")
        print()
        
        pool_sizes = pool_stats.get('pool_sizes', {})
        folders_list = folders.get('folders', [])
        
        all_ready = True
        total_codes = 0
        
        for folder_info in folders_list:
            folder_name = folder_info.get('folder', 'raiz')
            pool_size = folder_info.get('pool_size', 0)
            total_codes += pool_size
            
            emoji = get_status_emoji(pool_size, pool_max)
            bar = progress_bar(pool_size, pool_max, 30)
            
            if pool_size < pool_max:
                all_ready = False
            
            print(f"      {emoji} {folder_name:20} {bar}  {pool_size:3}/{pool_max}")
        
        print()
        print("  ─────────────────────────────────────────────────────────────────────────")
        
        # Status geral
        if all_ready:
            print()
            print("  🎉 TODOS OS POOLS ESTÃO CHEIOS! PRONTO PARA USAR!")
            print()
        else:
            print()
            print("  ⏳ Aguardando pools encherem...")
            print(f"     Total de códigos prontos: {total_codes}")
            print()
        
        print("  ─────────────────────────────────────────────────────────────────────────")
        print(f"  🔄 Atualizando a cada {REFRESH_INTERVAL}s | Pressione Ctrl+C para sair")
        print()
        
        time.sleep(REFRESH_INTERVAL)


if __name__ == "__main__":
    try:
        monitor()
    except KeyboardInterrupt:
        print("\n\n  👋 Monitor encerrado.\n")
        sys.exit(0)