<?php

/**
 * @package     Joomla.Plugin
 * @subpackage  System.logout
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

namespace Joomla\Plugin\System\Logout\Extension;

use Joomla\CMS\Application\ApplicationHelper;
use Joomla\CMS\Application\CMSApplicationInterface;
use Joomla\CMS\Event\User\LogoutEvent;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Event\SubscriberInterface;

// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects

/**
 * Plugin class for logout redirect handling.
 *
 * @since  1.6
 */
final class Logout extends CMSPlugin implements SubscriberInterface
{
    /**
     * @param   array                    $config      An optional associative array of configuration settings.
     * @param   CMSApplicationInterface  $app         The object to observe -- event dispatcher.
     *
     * @since   1.6
     */
    public function __construct(array $config, CMSApplicationInterface $app)
    {
        parent::__construct($config);

        $this->setApplication($app);

        // If we are on admin don't process.
        if (!$this->getApplication()->isClient('site')) {
            return;
        }

        $hash  = ApplicationHelper::getHash('PlgSystemLogout');

        if ($this->getApplication()->getInput()->cookie->getString($hash)) {
            // Destroy the cookie.
            $this->getApplication()->getInput()->cookie->set(
                $hash,
                '',
                [
                    'expires' => 1,
                    'path'    => $this->getApplication()->get('cookie_path', '/'),
                    'domain'  => $this->getApplication()->get('cookie_domain', ''),
                ]
            );
        }
    }

    /**
     * Returns an array of events this subscriber will listen to.
     *
     * @return array
     *
     * @since   5.3.0
     */
    public static function getSubscribedEvents(): array
    {
        return [
            'onUserLogout' => 'onUserLogout',
        ];
    }

    /**
     * Method to handle any logout logic and report back to the subject.
     *
     * @param   LogoutEvent $event  The event instance.
     *
     * @return  void
     *
     * @since   1.6
     */
    public function onUserLogout(LogoutEvent $event): void
    {
        if ($this->getApplication()->isClient('site')) {
            // Create the cookie.
            $this->getApplication()->getInput()->cookie->set(
                ApplicationHelper::getHash('PlgSystemLogout'),
                true,
                [
                    'expires'  => time() + 86400,
                    'path'     => $this->getApplication()->get('cookie_path', '/'),
                    'domain'   => $this->getApplication()->get('cookie_domain', ''),
                    'secure'   => $this->getApplication()->isHttpsForced(),
                    'httponly' => true,
                ]
            );
        }
    }
}
