<?php

/**
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; under version 2
 * of the License (non-upgradable).
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 * Copyright (c) 2016 (original work) Open Assessment Technologies SA;
 *
 *
 */

namespace oat\taoDeliveryRdf\scripts;

use common_report_Report as Report;
use oat\oatbox\extension\AbstractAction;
use oat\tao\model\accessControl\func\AccessRule;
use oat\tao\model\accessControl\func\AclProxy;
use oat\tao\model\entryPoint\EntryPointService;
use oat\tao\model\user\TaoRoles;
use oat\taoDeliveryRdf\model\guest\GuestAccess;

/**
 * Class DeactivateGuest
 * @package oat\taoDeliveryRdf\scripts
 * @author Antoine Robin, <antoine@taotesting.com>
 *
 * Run examples:
 *
 * - activate Guest Access
 * ```
 * sudo -u www-data php index.php 'oat\taoDeliveryRdf\scripts\ToggleGuestAccess' on
 * ```
 *
 * - deactivate Guest Access
 * ```
 * sudo -u www-data php index.php 'oat\taoDeliveryRdf\scripts\ToggleGuestAccess' off
 * ```
 */
class ToggleGuestAccess extends AbstractAction
{


    /**
     * @var EntryPointService
     */
    protected $entryPointService;


    /**
     * @param $params
     * @return Report
     */
    public function __invoke($params)
    {
        $mode = array_shift($params);
        $mode = strtolower($mode);
        $report = Report::createFailure('Please enter a valid mode on/off');
        $this->entryPointService = $this->getServiceManager()->get(EntryPointService::SERVICE_ID);
        if ($mode === 'off') {
            $report = $this->deactivate();
        } else {
            if ($mode === 'on') {
                $report = $this->activate();
            }
        }

        $this->getServiceManager()->register(EntryPointService::SERVICE_ID, $this->entryPointService);

        return $report;
    }

    /**
     * Try to deactivate the guest entry point
     * @return Report
     */
    private function deactivate()
    {
        $guestAccess = new GuestAccess();
        try {
            if (
                $this->entryPointService->deactivateEntryPoint(
                    $guestAccess->getId(),
                    EntryPointService::OPTION_PRELOGIN
                )
            ) {
                $rule = new AccessRule('grant', TaoRoles::ANONYMOUS, 'oat\taoDeliveryRdf\controller\Guest@guest');
                AclProxy::revokeRule($rule);

                return Report::createSuccess('The guest entry point has been correctly deactivated');
            } else {
                return Report::createInfo('The guest entry point was already deactivated');
            }
        } catch (\common_exception_InconsistentData $e) {
            return Report::createFailure($e->getMessage());
        }
    }

    /**
     * Try to activate the guest entry point
     * @return Report
     */
    private function activate()
    {
        $guestAccess = new GuestAccess();
        try {
            $this->entryPointService->activateEntryPoint($guestAccess->getId(), EntryPointService::OPTION_PRELOGIN);
            $rule = new AccessRule('grant', TaoRoles::ANONYMOUS, 'oat\taoDeliveryRdf\controller\Guest@guest');
            AclProxy::applyRule($rule);

            return Report::createSuccess('The guest entry point has been correctly activated');
        } catch (\common_exception_InconsistentData $e) {
            return Report::createFailure($e->getMessage());
        }
    }
}