from flask import Flask, request, jsonify
from flask_cors import CORS
import time
import logging
import json

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

app = Flask(__name__)
CORS(app)

# MEMORIA SEMPLICE
coordinators = {}
workers = {}
system_stats = {
    'connected_users': 1,
    'active_workers': 0,
    'online_coordinators': 0,
    'total_gpu_memory': 0,
    'total_requests': 12547,
    'system_uptime': int(time.time())
}

print("=" * 70)
print("🚀 ALLO CENTRAL SERVER - DASHBOARD MODE")
print("🌐 http://localhost:5000")
print("📊 Dashboard ready with real-time monitoring")
print("=" * 70)

@app.route('/api/register_coordinator', methods=['POST'])
def register_coordinator():
    try:
        data = request.json
        coord_id = data.get('coordinator_id', 'unknown')
        
        print(f"🎯 COORDINATOR REGISTRATION RECEIVED: {coord_id}")
        print(f"📊 Workers: {data.get('current_workers', 0)}, Memory: {data.get('total_gpu_memory', 0)}MB")

        # Salva coordinator
        coordinators[coord_id] = {
            'host': data.get('host', 'localhost'),
            'port': data.get('port', 8765),
            'workers': data.get('current_workers', 0),
            'total_memory': data.get('total_gpu_memory', 0),
            'performance_score': data.get('performance_score', 0),
            'last_seen': time.time(),
            'capabilities': data.get('capabilities', {})
        }

        print(f"✅ COORDINATOR REGISTERED: {coord_id}")
        return jsonify({'status': 'success', 'message': 'Coordinator registered'})

    except Exception as e:
        print(f"❌ COORDINATOR ERROR: {e}")
        return jsonify({'status': 'error', 'message': str(e)}), 400

@app.route('/api/register_node', methods=['POST'])
def register_node():
    try:
        data = request.json
        worker_id = data.get('node_id', 'unknown')
        
        print(f"🎯 WORKER REGISTRATION RECEIVED: {worker_id}")
        print(f"📊 GPU: {data.get('gpu_name')}, Memory: {data.get('gpu_memory', 0)}MB")

        # Salva worker
        workers[worker_id] = {
            'coordinator_id': data.get('coordinator_id', 'unknown'),
            'gpu_name': data.get('gpu_name', 'Unknown GPU'),
            'gpu_memory': data.get('gpu_memory', 0),
            'performance_score': data.get('performance_score', 0),
            'node_type': data.get('node_type', 'unknown'),
            'last_seen': time.time()
        }

        print(f"✅ WORKER REGISTERED: {worker_id} - {data.get('gpu_memory', 0)}MB")
        return jsonify({'status': 'success', 'message': 'Worker registered'})

    except Exception as e:
        print(f"❌ WORKER ERROR: {e}")
        return jsonify({'status': 'error', 'message': str(e)}), 400

@app.route('/api/system_stats', methods=['GET'])
def get_system_stats():
    # Calcola statistiche in tempo reale
    active_workers = len(workers)
    total_memory = sum(worker['gpu_memory'] for worker in workers.values())
    online_coords = len(coordinators)
    total_performance = sum(worker.get('performance_score', 0) for worker in workers.values())

    # Aggiorna statistiche
    updated_stats = {
        'connected_users': 1,
        'active_workers': active_workers,
        'online_coordinators': online_coords,
        'total_gpu_memory': total_memory,
        'total_performance': total_performance,
        'total_requests': 12547 + active_workers * 100,
        'system_uptime': int(time.time() - system_stats['system_uptime'])
    }

    if active_workers > 0:
        print(f"📊 LIVE: {active_workers} workers, {total_memory}MB memory, {online_coords} coordinators")

    return jsonify({'stats': updated_stats, 'timestamp': time.time()})

@app.route('/api/health', methods=['GET'])
def health():
    return jsonify({'status': 'online', 'timestamp': time.time()})

@app.route('/api/debug', methods=['GET'])
def debug():
    return jsonify({
        'coordinators': coordinators,
        'workers': workers,
        'total_coordinators': len(coordinators),
        'total_workers': len(workers),
        'total_memory': sum(worker['gpu_memory'] for worker in workers.values()),
        'total_performance': sum(worker.get('performance_score', 0) for worker in workers.values())
    })

@app.route('/api/coordinator/<coord_id>', methods=['GET'])
def get_coordinator(coord_id):
    if coord_id in coordinators:
        return jsonify({
            'coordinator': coordinators[coord_id],
            'workers': [w for w in workers.values() if w['coordinator_id'] == coord_id]
        })
    return jsonify({'error': 'Coordinator not found'}), 404

@app.route('/')
def dashboard():
    return '''
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>🚀 AllO AI - Distributed Computing Platform</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background: linear-gradient(135deg, #0c0c0c 0%, #1a1a2e 50%, #16213e 100%);
            color: #ffffff;
            min-height: 100vh;
            line-height: 1.6;
        }

        .container {
            max-width: 1400px;
            margin: 0 auto;
            padding: 20px;
        }

        .header {
            text-align: center;
            padding: 60px 20px;
            background: linear-gradient(135deg, rgba(0, 122, 204, 0.1) 0%, rgba(0, 255, 136, 0.1) 100%);
            border-radius: 25px;
            margin-bottom: 40px;
            border: 1px solid rgba(0, 122, 204, 0.3);
            backdrop-filter: blur(10px);
        }

        .header h1 {
            font-size: 4.5em;
            font-weight: 800;
            margin-bottom: 15px;
            background: linear-gradient(45deg, #007acc, #00ff88, #007acc);
            background-size: 200% 200%;
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            animation: gradientShift 3s ease infinite;
        }

        @keyframes gradientShift {
            0%, 100% { background-position: 0% 50%; }
            50% { background-position: 100% 50%; }
        }

        .status-badge {
            display: inline-block;
            padding: 12px 30px;
            background: linear-gradient(45deg, #00ff88, #00cc66);
            color: #000000;
            border-radius: 50px;
            font-weight: bold;
            font-size: 1.1em;
            box-shadow: 0 0 30px rgba(0, 255, 136, 0.5);
        }

        .stats-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
            gap: 25px;
            margin: 40px 0;
        }

        .stat-card {
            background: rgba(255, 255, 255, 0.05);
            padding: 30px;
            border-radius: 20px;
            text-align: center;
            border: 1px solid rgba(255, 255, 255, 0.1);
            backdrop-filter: blur(10px);
            transition: transform 0.3s ease, border-color 0.3s ease;
        }

        .stat-card:hover {
            transform: translateY(-5px);
            border-color: #007acc;
        }

        .stat-number {
            font-size: 3.5em;
            font-weight: 800;
            margin-bottom: 10px;
            background: linear-gradient(45deg, #007acc, #00ff88);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
        }

        .stat-label {
            font-size: 1.2em;
            color: #cccccc;
            font-weight: 500;
        }

        .panels-grid {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 30px;
            margin: 40px 0;
        }

        @media (max-width: 768px) {
            .panels-grid {
                grid-template-columns: 1fr;
            }
        }

        .panel {
            background: rgba(255, 255, 255, 0.05);
            padding: 30px;
            border-radius: 20px;
            border: 1px solid rgba(255, 255, 255, 0.1);
            backdrop-filter: blur(10px);
        }

        .panel h2 {
            font-size: 1.8em;
            margin-bottom: 20px;
            color: #00ff88;
            border-bottom: 2px solid #00ff88;
            padding-bottom: 10px;
        }

        .coordinator-item, .worker-item {
            background: rgba(255, 255, 255, 0.02);
            padding: 20px;
            margin: 15px 0;
            border-radius: 12px;
            border-left: 4px solid #007acc;
            transition: all 0.3s ease;
        }

        .worker-item {
            border-left-color: #00ff88;
        }

        .coordinator-item:hover, .worker-item:hover {
            background: rgba(255, 255, 255, 0.08);
            transform: translateX(5px);
        }

        .item-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 10px;
        }

        .item-id {
            font-weight: bold;
            color: #00ff88;
            font-family: 'Courier New', monospace;
        }

        .item-details {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
            gap: 10px;
            font-size: 0.9em;
            color: #cccccc;
        }

        .detail-item {
            display: flex;
            flex-direction: column;
        }

        .detail-label {
            font-size: 0.8em;
            color: #888;
            margin-bottom: 2px;
        }

        .detail-value {
            font-weight: 600;
            color: #fff;
        }

        .performance-badge {
            display: inline-block;
            padding: 4px 12px;
            background: linear-gradient(45deg, #ff6b6b, #ee5a24);
            border-radius: 20px;
            font-size: 0.8em;
            font-weight: bold;
        }

        .memory-badge {
            display: inline-block;
            padding: 4px 12px;
            background: linear-gradient(45deg, #4834d4, #686de0);
            border-radius: 20px;
            font-size: 0.8em;
            font-weight: bold;
        }

        .last-seen {
            font-size: 0.8em;
            color: #888;
            font-style: italic;
        }

        .empty-state {
            text-align: center;
            padding: 40px;
            color: #888;
            font-style: italic;
        }

        .last-update {
            text-align: center;
            margin-top: 20px;
            color: #888;
            font-size: 0.9em;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>🚀 AllO AI</h1>
            <p style="font-size: 1.4em; color: #cccccc; margin-bottom: 30px;">
                Next-Generation Distributed AI Computing Platform
            </p>
            <div class="status-badge">LIVE • REAL-TIME • DISTRIBUTED</div>
        </div>

        <div class="stats-grid" id="statsGrid">
            <!-- Stats will be populated by JavaScript -->
        </div>

        <div class="panels-grid">
            <div class="panel">
                <h2>📡 Connected Coordinators</h2>
                <div id="coordinatorsList">
                    <div class="empty-state">Loading coordinators...</div>
                </div>
            </div>

            <div class="panel">
                <h2>⚡ Active Workers</h2>
                <div id="workersList">
                    <div class="empty-state">Loading workers...</div>
                </div>
            </div>
        </div>

        <div class="last-update" id="lastUpdate">
            Last update: <span id="updateTime">Loading...</span>
        </div>
    </div>

    <script>
        async function loadDashboardData() {
            try {
                // Load system stats
                const statsResponse = await fetch('/api/system_stats');
                const statsData = await statsResponse.json();

                // Update stats grid
                document.getElementById('statsGrid').innerHTML = `
                    <div class="stat-card">
                        <div class="stat-number">${statsData.stats.connected_users}</div>
                        <div class="stat-label">Connected Users</div>
                    </div>
                    <div class="stat-card">
                        <div class="stat-number">${statsData.stats.active_workers}</div>
                        <div class="stat-label">Active Workers</div>
                    </div>
                    <div class="stat-card">
                        <div class="stat-number">${statsData.stats.online_coordinators}</div>
                        <div class="stat-label">Coordinators</div>
                    </div>
                    <div class="stat-card">
                        <div class="stat-number">${Math.round(statsData.stats.total_gpu_memory / 1024)}</div>
                        <div class="stat-label">GPU Memory (GB)</div>
                    </div>
                    <div class="stat-card">
                        <div class="stat-number">${statsData.stats.total_performance.toFixed(1)}</div>
                        <div class="stat-label">Total Performance</div>
                    </div>
                    <div class="stat-card">
                        <div class="stat-number">${statsData.stats.total_requests}</div>
                        <div class="stat-label">Total Requests</div>
                    </div>
                `;

                // Load debug data for coordinators and workers
                const debugResponse = await fetch('/api/debug');
                const debugData = await debugResponse.json();

                // Update coordinators list
                if (debugData.total_coordinators > 0) {
                    document.getElementById('coordinatorsList').innerHTML = Object.entries(debugData.coordinators)
                        .map(([id, coord]) => `
                            <div class="coordinator-item">
                                <div class="item-header">
                                    <span class="item-id">${id}</span>
                                    <span class="performance-badge">Score: ${coord.performance_score?.toFixed(1) || 'N/A'}</span>
                                </div>
                                <div class="item-details">
                                    <div class="detail-item">
                                        <span class="detail-label">Host:Port</span>
                                        <span class="detail-value">${coord.host}:${coord.port}</span>
                                    </div>
                                    <div class="detail-item">
                                        <span class="detail-label">Workers</span>
                                        <span class="detail-value">${coord.workers}</span>
                                    </div>
                                    <div class="detail-item">
                                        <span class="detail-label">Memory</span>
                                        <span class="detail-value memory-badge">${Math.round(coord.total_memory / 1024)} GB</span>
                                    </div>
                                    <div class="detail-item">
                                        <span class="detail-label">Last Seen</span>
                                        <span class="detail-value last-seen">${Math.round((Date.now()/1000 - coord.last_seen))}s ago</span>
                                    </div>
                                </div>
                            </div>
                        `).join('');
                } else {
                    document.getElementById('coordinatorsList').innerHTML = '<div class="empty-state">No coordinators connected</div>';
                }

                // Update workers list
                if (debugData.total_workers > 0) {
                    document.getElementById('workersList').innerHTML = Object.entries(debugData.workers)
                        .map(([id, worker]) => `
                            <div class="worker-item">
                                <div class="item-header">
                                    <span class="item-id">${id}</span>
                                    <span class="performance-badge">${worker.performance_score?.toFixed(1) || 'N/A'}</span>
                                </div>
                                <div class="item-details">
                                    <div class="detail-item">
                                        <span class="detail-label">GPU</span>
                                        <span class="detail-value">${worker.gpu_name}</span>
                                    </div>
                                    <div class="detail-item">
                                        <span class="detail-label">Memory</span>
                                        <span class="detail-value memory-badge">${Math.round(worker.gpu_memory / 1024)} GB</span>
                                    </div>
                                    <div class="detail-item">
                                        <span class="detail-label">Type</span>
                                        <span class="detail-value">${worker.node_type || 'standard'}</span>
                                    </div>
                                    <div class="detail-item">
                                        <span class="detail-label">Coordinator</span>
                                        <span class="detail-value">${worker.coordinator_id}</span>
                                    </div>
                                </div>
                            </div>
                        `).join('');
                } else {
                    document.getElementById('workersList').innerHTML = '<div class="empty-state">No workers active</div>';
                }

                // Update last update time
                document.getElementById('updateTime').textContent = new Date().toLocaleTimeString();

            } catch (error) {
                console.error('Error loading dashboard data:', error);
                document.getElementById('statsGrid').innerHTML = '<div class="empty-state">Error loading data</div>';
            }
        }

        // Load data immediately and set up auto-refresh
        loadDashboardData();
        setInterval(loadDashboardData, 3000); // Refresh every 3 seconds

        // Add some visual effects
        document.addEventListener('DOMContentLoaded', function() {
            // Add loading animation
            const cards = document.querySelectorAll('.stat-card');
            cards.forEach((card, index) => {
                card.style.animationDelay = `${index * 0.1}s`;
            });
        });
    </script>
</body>
</html>
    '''

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)