<?php
/**
 * @package     plg_task_htpautoupdate
 * @copyright   (C) 2026 Pascal Lohmann / website-bereinigung.de
 * @license     GNU General Public License version 2 or later
 *
 * Task-Plugin (Joomla Task Scheduler, com_scheduler, J4.1+). REINE BRUECKE: meldet
 * die Routine "htp.autoupdate" an und fuehrt je Lauf EINEN resumebaren Schritt der
 * HTProtect-Auto-Update-State-Machine aus (HtpAutoUpdate::runStep). KEINE Logik hier.
 * Wird von der HTProtect-Komponente verwaltet (installiert/aktiviert/entfernt) und
 * ist nur >= Joomla 5.4 aktiv. Faellt nie hart aus.
 */

defined('_JEXEC') or die;

use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Component\Scheduler\Administrator\Event\ExecuteTaskEvent;
use Joomla\Component\Scheduler\Administrator\Task\Status;
use Joomla\Component\Scheduler\Administrator\Traits\TaskPluginTrait;
use Joomla\Event\SubscriberInterface;

/**
 * HTProtect - Erweiterungs-Auto-Update (Scheduler-Routine).
 */
class PlgTaskHtpautoupdate extends CMSPlugin implements SubscriberInterface
{
    use TaskPluginTrait;

    /**
     * Eigene Sprachdateien automatisch laden.
     *
     * @var  boolean
     */
    protected $autoloadLanguage = true;

    /**
     * Gemeldete Routinen (eine: htp.autoupdate). Der Trait nutzt das zum Anmelden
     * (onTaskOptionsList) und zum Routing (onExecuteTask -> 'method').
     *
     * @var  array
     */
    private const TASKS_MAP = array(
        'htp.autoupdate' => array(
            'langConstPrefix' => 'PLG_TASK_HTPAUTOUPDATE_TASK',
            'method'          => 'runAutoUpdateStep',
        ),
    );

    /**
     * Abonnierte Scheduler-Events. advertiseRoutines + standardRoutineHandler kommen
     * aus dem TaskPluginTrait (Anmeldung der Routine + Status/endRoutine-Handling).
     *
     * @return array
     */
    public static function getSubscribedEvents(): array
    {
        return array(
            'onTaskOptionsList' => 'advertiseRoutines',
            'onExecuteTask'     => 'standardRoutineHandler',
        );
    }

    /**
     * EIN Schritt der State-Machine. Laedt die HTProtect-Engine und delegiert; alle
     * Logik (Faelligkeit, Backup, Install, Verify, Rollback, Crash-Recovery) steckt
     * in HtpAutoUpdate::runStep. Fail-open: ein Fehler darf weder Site noch Scheduler
     * hart stoeren.
     *
     * @param   ExecuteTaskEvent  $event  Scheduler-Event
     *
     * @return int  Status-Code (Status::OK)
     */
    protected function runAutoUpdateStep(ExecuteTaskEvent $event): int
    {
        try {
            $boot = JPATH_ADMINISTRATOR . '/components/com_htprotect/core/bootstrap.php';

            if (is_file($boot)) {
                require_once $boot;
            }

            if (class_exists('HtpAutoUpdate') && method_exists('HtpAutoUpdate', 'runStep')) {
                HtpAutoUpdate::runStep('task');
            }
        } catch (\Throwable $e) {
            // fail-open
        }

        return Status::OK;
    }
}
