<?php
/**
 * Plugin Auto Approve
 *
 * Aprueba automáticamente páginas NUEVAS en el namespace proyectos
 */

if (!defined('DOKU_INC')) die();

class action_plugin_autoapprove extends DokuWiki_Action_Plugin
{
    /** @var helper_plugin_publish */
    protected $publishHelper = null;

    /** @var array Pages pendientes de aprobar */
    protected static $pendingApprovals = [];

    /**
     * Debug log - desactivado en produccion
     */
    protected function debugLog($message)
    {
        // Debug desactivado en produccion para evitar exposicion de informacion
        // Para depurar, descomentar las lineas siguientes:
        // $logFile = DOKU_PLUGIN . 'autoapprove/debug.log';
        // $timestamp = date('Y-m-d H:i:s');
        // @file_put_contents($logFile, "[$timestamp] $message\n", FILE_APPEND);
    }

    /**
     * Registrar eventos
     */
    public function register(Doku_Event_Handler $controller)
    {
        $this->debugLog("=== PLUGIN AUTOAPPROVE LOADED ===");

        // Capturar cuando se guarda una página nueva
        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handleSave', [], 10);
        // Aprobar después de que todo termine
        $controller->register_hook('DOKUWIKI_DONE', 'BEFORE', $this, 'processPendingApprovals', [], 999);

        $this->debugLog("Hooks registered: COMMON_WIKIPAGE_SAVE, DOKUWIKI_DONE");
    }

    /**
     * Manejar guardado de página
     */
    public function handleSave(Doku_Event $event, $param)
    {
        $this->debugLog("=== COMMON_WIKIPAGE_SAVE triggered ===");

        $id = $event->data['id'];
        $changeType = $event->data['changeType'];
        $newRevision = $event->data['newRevision'];

        $this->debugLog("ID: $id");
        $this->debugLog("changeType: $changeType (CREATE=" . DOKU_CHANGE_TYPE_CREATE . ")");
        $this->debugLog("newRevision: $newRevision");

        // Solo aprobar páginas NUEVAS (changeType = DOKU_CHANGE_TYPE_CREATE)
        if ($changeType !== DOKU_CHANGE_TYPE_CREATE) {
            $this->debugLog("SKIP: not a new page (changeType=$changeType != CREATE)");
            return;
        }

        // Solo aprobar páginas en namespace "proyectos"
        if (strpos($id, 'proyectos:') !== 0) {
            $this->debugLog("SKIP: id '$id' does not start with 'proyectos:'");
            return;
        }

        $this->debugLog("QUEUED for approval: $id with revision $newRevision");

        // Marcar para aprobar después
        self::$pendingApprovals[$id] = $newRevision;
    }

    /**
     * Procesar aprobaciones pendientes al final del proceso
     */
    public function processPendingApprovals(Doku_Event $event, $param)
    {
        if (empty(self::$pendingApprovals)) {
            return;
        }

        $this->debugLog("=== DOKUWIKI_DONE - Processing pending approvals ===");

        // Cargar helper de publish
        if (!$this->publishHelper) {
            $this->publishHelper = plugin_load('helper', 'publish');
        }

        if (!$this->publishHelper) {
            $this->debugLog("ERROR: publish helper not loaded");
            return;
        }

        foreach (self::$pendingApprovals as $id => $revision) {
            $this->debugLog("Processing: $id");
            $this->approvePage($id, $revision);
        }

        // Limpiar la lista
        self::$pendingApprovals = [];
    }

    /**
     * Aprobar una página
     */
    protected function approvePage($id, $revision)
    {
        $this->debugLog("approvePage called for: $id with revision: $revision");

        // Obtener metadatos actuales
        $meta = p_get_metadata($id);
        $approvals = isset($meta['approval']) ? $meta['approval'] : [];

        $this->debugLog("Existing approvals: " . json_encode($approvals));

        // Si no hay revisión, intentar obtenerla del archivo
        if (!$revision) {
            $file = wikiFN($id);
            $revision = @filemtime($file);
            if (!$revision) {
                $revision = time();
            }
            $this->debugLog("Got revision from file: $revision");
        }

        if (!isset($approvals[$revision])) {
            $approvals[$revision] = [];
        }

        // Agregar aprobación automática
        $approvals[$revision]['autoapprove'] = [
            'AutoApprove',
            'system',
            'system@autoapprove',
            $revision
        ];

        $this->debugLog("New approvals structure: " . json_encode($approvals));

        // Guardar metadatos
        $result = p_set_metadata($id, ['approval' => $approvals], true, true);
        $this->debugLog("p_set_metadata result: " . var_export($result, true));

        // Verificar que se guardó
        $checkMeta = p_get_metadata($id);
        $this->debugLog("Verification - saved approvals: " . json_encode(isset($checkMeta['approval']) ? $checkMeta['approval'] : 'NOT SET'));
    }
}
