<?php
/**
 * DESACTIVAR MANTENIMIENTO NICC
 * Restaura el sistema a su estado normal
 *
 * USO WEB: https://tu-dominio.com/ruta/mantenimiento/desactivar.php
 * USO CLI: php desactivar.php
 */

error_reporting(E_ALL);
ini_set('display_errors', 1);
set_time_limit(300);

require_once __DIR__ . '/config.php';

class DesactivarMantenimiento {
    private $log = [];
    private $sitesRestored = 0;
    private $errors = 0;

    public function run($fullRestore = false) {
        $this->log("=== DESACTIVACIÓN DE MANTENIMIENTO NICC ===");
        $this->log("Fecha: " . date('Y-m-d H:i:s'));
        $this->log("Modo: " . ($fullRestore ? 'Restauración completa' : 'Rápido (solo flags)'));
        $this->log("");

        // Buscar sitios con mantenimiento activo
        $sites = $this->findMaintenanceSites();

        if (empty($sites)) {
            $this->log("No se encontraron sitios con mantenimiento activo.");
            $this->output();
            return true;
        }

        $this->log("Encontrados " . count($sites) . " sitio(s) con mantenimiento");
        $this->log("");

        foreach ($sites as $sitePath) {
            $this->restoreSite($sitePath, $fullRestore);
        }

        $this->log("");
        $this->log("=== RESUMEN ===");
        $this->log("Sitios restaurados: {$this->sitesRestored}");
        $this->log("Errores: {$this->errors}");

        if ($this->errors === 0) {
            $this->log("");
            $this->log("✅ MANTENIMIENTO DESACTIVADO", 'success');
        }

        $this->output();
        return $this->errors === 0;
    }

    private function findMaintenanceSites() {
        $sites = [];

        foreach (SEARCH_PATHS as $basePath) {
            if (!is_dir($basePath)) continue;
            $this->scanForFlags($basePath, $sites);
        }

        return $sites;
    }

    /**
     * Escanea SOLO el nivel inmediato de $path buscando flags de mantenimiento.
     * No recursa en subdirectorios para evitar duplicados.
     */
    private function scanForFlags($path, &$sites) {
        if (!is_dir($path)) return;

        $items = @scandir($path);
        if (!$items) return;

        foreach ($items as $item) {
            if ($item === '.' || $item === '..') continue;
            if ($item[0] === '_') continue;
            $fullPath = $path . '/' . $item;
            if (is_link($fullPath)) continue;
            if (!is_dir($fullPath)) continue;

            $flagFile = $fullPath . '/' . FLAG_FILE;
            if (file_exists($flagFile)) {
                $sites[] = $fullPath;
            }
        }
    }

    private function restoreSite($sitePath, $fullRestore) {
        $this->log("--- Restaurando: $sitePath ---");

        $dokuFile = $sitePath . '/doku.php';
        $backupFile = $sitePath . '/doku.php' . BACKUP_SUFFIX;
        $flagFile = $sitePath . '/' . FLAG_FILE;
        $htmlFile = $sitePath . '/' . MAINTENANCE_HTML;

        try {
            // 1. Eliminar flag (SIEMPRE - esto desactiva el mantenimiento)
            if (file_exists($flagFile)) {
                if (!unlink($flagFile)) {
                    throw new Exception("No se pudo eliminar flag de mantenimiento");
                }
                $this->log("  Flag eliminado");
            }

            if ($fullRestore) {
                // 2. Restaurar doku.php original
                if (file_exists($backupFile)) {
                    if (!copy($backupFile, $dokuFile)) {
                        throw new Exception("No se pudo restaurar doku.php");
                    }
                    $this->log("  doku.php restaurado desde backup");

                    // Eliminar backup después de restaurar
                    unlink($backupFile);
                    $this->log("  Backup eliminado");
                } else {
                    $this->log("  ADVERTENCIA: No existe backup de doku.php", 'warn');
                }

                // 3. Eliminar HTML de mantenimiento
                if (file_exists($htmlFile)) {
                    unlink($htmlFile);
                    $this->log("  mantenimiento.html eliminado");
                }
            } else {
                $this->log("  Modo rápido: solo se eliminó el flag");
                $this->log("  (El parche PHP detecta que no hay flag y carga DokuWiki normal)");
            }

            $this->sitesRestored++;
            $this->log("  ✓ Sitio restaurado");

        } catch (Exception $e) {
            $this->errors++;
            $this->log("  ERROR: " . $e->getMessage(), 'error');
        }
    }

    private function log($message, $type = 'normal') {
        $this->log[] = ['message' => $message, 'type' => $type];
    }

    private function output() {
        $isCLI = php_sapi_name() === 'cli';

        if ($isCLI) {
            foreach ($this->log as $entry) {
                echo $entry['message'] . "\n";
            }
        } else {
            header('Content-Type: text/html; charset=UTF-8');
            echo '<!DOCTYPE html><html><head><meta charset="UTF-8">';
            echo '<title>Desactivar Mantenimiento NICC</title>';
            echo '<style>
                body { font-family: monospace; background: #1a1a2e; color: #eee; padding: 20px; }
                .log { background: #16213e; padding: 20px; border-radius: 8px; max-width: 900px; margin: 0 auto; }
                .error { color: #ff6b6b; }
                .warn { color: #ffd93d; }
                .success { color: #6bcb77; font-weight: bold; }
                .info { color: #4d96ff; }
                h1 { color: #fff; text-align: center; }
                a { color: #4d96ff; }
            </style></head><body>';
            echo '<h1>🔓 Desactivar Mantenimiento NICC</h1>';
            echo '<div class="log"><pre>';

            foreach ($this->log as $entry) {
                $class = $entry['type'];
                $msg = htmlspecialchars($entry['message']);
                echo "<span class=\"$class\">$msg</span>\n";
            }

            echo '</pre></div>';
            echo '<p style="text-align:center;margin-top:20px;">';
            echo '<a href="activar.php">Activar Mantenimiento</a> | ';
            echo '<a href="estado.php">Ver Estado</a>';
            echo '</p></body></html>';
        }
    }
}

// === DETERMINAR MODO ===
$fullRestore = isset($_GET['full']) || (isset($argv[1]) && $argv[1] === '--full');

$desactivar = new DesactivarMantenimiento();
$desactivar->run($fullRestore);
