<?php
/**
 * ============================================================================
 * NEXWORKER OS — CONECTOR UNIVERSAL REMOTO PHP PARA WEBS & SERVIDORES GSM
 * ============================================================================
 * Diseñado para: DHRU Fusion, WooCommerce GSM, Tiendas de Celulares, Scripts PHP.
 * Permite al Agente Autónomo:
 * 1. Diagnosticar y leer logs de error (error_log) para reparar caídas PHP 500.
 * 2. Consultar y modificar datos en MySQL (precios de créditos, activación de marcas).
 * 3. Ejecutar modificaciones de código en caliente de forma segura con rollback.
 * 4. Gestionar enlaces de descargas de firmwares y soporte técnico.
 * 
 * INSTALACIÓN:
 * 1. Sube este archivo 'nexworker-bridge.php' a la raíz de tu servidor web (public_html o raíz del dominio).
 * 2. Define tu clave secreta privada en la constante 'BRIDGE_SECRET_KEY' abajo.
 * ============================================================================
 */

// CLAVE DE SEGURIDAD PRIVADA (Cámbiala por tu clave personal)
define('BRIDGE_SECRET_KEY', 'NexWorkerGSM_SecretPass_2026');

header('Content-Type: application/json; charset=utf-8');

// Verificación de método
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['success' => false, 'error' => 'Método no permitido. Use POST.']);
    exit;
}

// Obtener payload JSON o POST
$input = file_get_contents('php://input');
$data = json_decode($input, true);
if (!$data) {
    $data = $_POST;
}

// Validar Token Secreto
$provided_key = isset($data['secret_key']) ? $data['secret_key'] : (isset($_SERVER['HTTP_X_BRIDGE_KEY']) ? $_SERVER['HTTP_X_BRIDGE_KEY'] : '');
if ($provided_key !== BRIDGE_SECRET_KEY) {
    http_response_code(401);
    echo json_encode([
        'success' => false, 
        'error' => 'Acceso Denegado: Clave secreta BRIDGE_SECRET_KEY inválida o ausente.'
    ]);
    exit;
}

$action = isset($data['action']) ? strtolower(trim($data['action'])) : 'status';

try {
    switch ($action) {
        case 'status':
            // Diagnóstico de Salud del Servidor PHP
            echo json_encode([
                'success' => true,
                'status' => 'ONLINE',
                'php_version' => phpversion(),
                'server_software' => $_SERVER['SERVER_SOFTWARE'] ?? 'Unknown',
                'server_ip' => $_SERVER['SERVER_ADDR'] ?? gethostbyname(gethostname()),
                'document_root' => $_SERVER['DOCUMENT_ROOT'] ?? __DIR__,
                'os' => PHP_OS,
                'memory_limit' => ini_get('memory_limit'),
                'max_execution_time' => ini_get('max_execution_time'),
                'mysql_enabled' => extension_loaded('mysqli') || extension_loaded('pdo_mysql'),
                'curl_enabled' => extension_loaded('curl'),
                'timestamp' => date('Y-m-d H:i:s')
            ]);
            break;

        case 'read_errors':
            // Lectura en tiempo real del error_log para reparar bugs
            $log_path = isset($data['log_path']) ? $data['log_path'] : (__DIR__ . '/error_log');
            if (file_exists($log_path)) {
                $lines = isset($data['lines']) ? intval($data['lines']) : 50;
                $file = file($log_path);
                $slice = array_slice($file, -$lines);
                echo json_encode([
                    'success' => true,
                    'found' => true,
                    'file' => $log_path,
                    'lines' => $slice
                ]);
            } else {
                echo json_encode([
                    'success' => true,
                    'found' => false,
                    'message' => 'No se encontró archivo error_log en la raíz. El servidor se encuentra estable.'
                ]);
            }
            break;

        case 'read_file':
            // Lectura de archivo para auditoría de código
            $file_to_read = isset($data['file']) ? realpath($data['file']) : null;
            if (!$file_to_read || !file_exists($file_to_read)) {
                echo json_encode(['success' => false, 'error' => 'Archivo no encontrado o ruta inválida.']);
                break;
            }
            echo json_encode([
                'success' => true,
                'file' => $file_to_read,
                'content' => file_get_contents($file_to_read)
            ]);
            break;

        case 'modify_file':
            // Reparación / Modificación con Backup Automático de Seguridad
            $target = isset($data['file']) ? $data['file'] : null;
            $new_code = isset($data['code']) ? $data['code'] : null;
            if (!$target || $new_code === null) {
                echo json_encode(['success' => false, 'error' => 'Falta el nombre de archivo o el código.']);
                break;
            }
            // Crear backup previo
            if (file_exists($target)) {
                @copy($target, $target . '.bak_' . date('Ymd_His'));
            }
            $written = file_put_contents($target, $new_code);
            echo json_encode([
                'success' => ($written !== false),
                'bytes_written' => $written,
                'file' => $target,
                'message' => 'Archivo modificado con éxito. Respaldo previo generado.'
            ]);
            break;

        case 'db_query':
            // Consulta MySQL para servidores DHRU o WordPress
            $db_host = isset($data['db_host']) ? $data['db_host'] : 'localhost';
            $db_user = isset($data['db_user']) ? $data['db_user'] : '';
            $db_pass = isset($data['db_pass']) ? $data['db_pass'] : '';
            $db_name = isset($data['db_name']) ? $data['db_name'] : '';
            $query = isset($data['query']) ? $data['query'] : '';

            if (!$query || !$db_name) {
                echo json_encode(['success' => false, 'error' => 'Datos de conexión o consulta incompletos.']);
                break;
            }

            $mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name);
            if ($mysqli->connect_error) {
                echo json_encode(['success' => false, 'error' => 'Error de conexión MySQL: ' . $mysqli->connect_error]);
                break;
            }

            $res = $mysqli->query($query);
            if ($res === true) {
                echo json_encode([
                    'success' => true, 
                    'affected_rows' => $mysqli->affected_rows,
                    'insert_id' => $mysqli->insert_id
                ]);
            } elseif ($res) {
                $rows = [];
                while ($row = $res->fetch_assoc()) {
                    $rows[] = $row;
                }
                echo json_encode(['success' => true, 'rows' => $rows, 'count' => count($rows)]);
            } else {
                echo json_encode(['success' => false, 'error' => $mysqli->error]);
            }
            $mysqli->close();
            break;

        default:
            echo json_encode(['success' => false, 'error' => 'Acción no reconocida: ' . $action]);
            break;
    }
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
