<?php

/*
 * This file is part of MODX Revolution.
 *
 * Copyright (c) MODX, LLC. All Rights Reserved.
 *
 * For complete copyright and license information, see the COPYRIGHT and LICENSE
 * files found in the top-level directory of this distribution.
 */

use MODX\Revolution\modManagerController;
use MODX\Revolution\modSystemEvent;
use MODX\Revolution\modUser;

/**
 * Loads update user page
 *
 * @package modx
 * @subpackage manager.controllers
 */

class SecurityUserUpdateManagerController extends modManagerController
{
    /** @var string $onUserFormRender */
    public $onUserFormRender = '';
    /** @var array $extendedFields */
    public $extendedFields = [];
    /** @var array $remoteFields */
    public $remoteFields = [];
    /** @var modUser $user */
    public $user;

    /**
     * Check for any permissions or requirements to load page
     * @return bool
     */
    public function checkPermissions()
    {
        return $this->modx->hasPermission('edit_user');
    }

    /**
     * Register custom CSS/JS for the page
     * @return void
     */
    public function loadCustomCssJs()
    {
        $mgrUrl = $this->modx->getOption('manager_url', null, MODX_MANAGER_URL);
        $this->addHtml('<script>
// <![CDATA[
MODx.onUserFormRender = "' . $this->onUserFormRender . '";
MODx.perm.set_sudo = ' . ($this->modx->hasPermission('set_sudo') ? 1 : 0) . ';
MODx.perm.user_settings = ' . (($this->modx->hasPermission('settings') && $this->modx->hasPermission('namespace')) ? 1 : 0) . ';
// ]]>
</script>');

        /* register JS scripts */
        $this->addJavascript($mgrUrl . 'assets/modext/widgets/core/modx.orm.js');
        $this->addJavascript($mgrUrl . 'assets/modext/widgets/core/modx.grid.settings.js');
        $this->addJavascript($mgrUrl . 'assets/modext/widgets/security/modx.grid.user.settings.js');
        $this->addJavascript($mgrUrl . 'assets/modext/widgets/security/modx.grid.user.group.js');
        $this->addJavascript($mgrUrl . 'assets/modext/widgets/security/modx.panel.user.js');
        $this->addJavascript($mgrUrl . 'assets/modext/sections/security/user/update.js');
        $this->addHtml('<script>
// <![CDATA[
Ext.onReady(function() {
    MODx.load({
        xtype: "modx-page-user-update"
        ,user: "' . $this->user->get('id') . '"
        ' . (!empty($this->remoteFields) ? ',remoteFields: ' . $this->modx->toJSON($this->remoteFields) : '') . '
        ' . (!empty($this->extendedFields) ? ',extendedFields: ' . $this->modx->toJSON($this->extendedFields) : '') . '
    });
});
// ]]>
</script>');
    }

    /**
     * Custom logic code here for setting placeholders, etc
     * @param array $scriptProperties
     * @return mixed
     */
    public function process(array $scriptProperties = [])
    {
        $placeholders = [];

        /* get user */
        if (empty($scriptProperties['id']) || strlen($scriptProperties['id']) !== strlen((int)$scriptProperties['id'])) {
            return $this->failure($this->modx->lexicon('user_err_ns'));
        }
        $this->user = $this->modx->getObject(modUser::class, ['id' => $scriptProperties['id']]);
        if ($this->user == null) {
            return $this->failure($this->modx->lexicon('user_err_nf'));
        }

        /* process remote data, if existent */
        $this->remoteFields = [];
        $remoteData = $this->user->get('remote_data');
        if (!empty($remoteData)) {
            $this->remoteFields = $this->_parseCustomData($remoteData);
        }

        /* parse extended data, if existent */
        $this->user->getOne('Profile');
        if ($this->user->Profile) {
            $this->extendedFields = [];
            $extendedData = $this->user->Profile->get('extended');
            if (!empty($extendedData)) {
                $this->extendedFields = $this->_parseCustomData($extendedData);
            }
        }

        /* invoke OnUserFormPrerender event */
        $onUserFormPrerender = $this->modx->invokeEvent('OnUserFormPrerender', [
            'id' => $this->user->get('id'),
            'user' => &$this->user,
            'mode' => modSystemEvent::MODE_UPD,
        ]);
        if (is_array($onUserFormPrerender)) {
            $onUserFormPrerender = implode('', $onUserFormPrerender);
        }
        $placeholders['OnUserFormPrerender'] = $onUserFormPrerender;

        /* invoke OnUserFormRender event */
        $onUserFormRender = $this->modx->invokeEvent('OnUserFormRender', [
            'id' => $this->user->get('id'),
            'user' => &$this->user,
            'mode' => modSystemEvent::MODE_UPD,
        ]);
        if (is_array($onUserFormRender)) {
            $onUserFormRender = implode('', $onUserFormRender);
        }
        $this->onUserFormRender = str_replace(['"', "\n", "\r"], ['\"', '', ''], $onUserFormRender);
        $placeholders['OnUserFormRender'] = $this->onUserFormRender;

        return $placeholders;
    }

    private function _parseCustomData(array $remoteData = [], $path = '')
    {
        $usemb = function_exists('mb_strlen') && (bool)$this->modx->getOption('use_multibyte', null, false);
        $encoding = $this->modx->getOption('modx_charset', null, 'UTF-8');
        $fields = [];
        foreach ($remoteData as $key => $value) {
            $field = [
                'name' => $key,
                'id' => (!empty($path) ? $path . '.' : '') . $key,
            ];
            if (is_array($value)) {
                $field['iconCls'] = 'icon-folder';
                $field['text'] = htmlentities($key, ENT_QUOTES, $encoding);
                $field['leaf'] = false;
                $field['children'] = $this->_parseCustomData($value, $key);
            } else {
                $v = $value;
                if ($usemb) {
                    if (mb_strlen($v, $encoding) > 30) {
                        $v = mb_substr($v, 0, 30, $encoding) . '...';
                    }
                } elseif (strlen($v) > 30) {
                    $v = substr($v, 0, 30) . '...';
                }
                $field['iconCls'] = 'icon-terminal';
                $field['text'] = htmlentities($key, ENT_QUOTES, $encoding) . ' - <i>' . htmlentities($v, ENT_QUOTES, $encoding) . '</i>';
                $field['leaf'] = true;
                $field['value'] = $value;
            }
            $fields[] = $field;
        }
        return $fields;
    }

    /**
     * Return the pagetitle
     *
     * @return string
     */
    public function getPageTitle()
    {
        if ($this->user == null) {
            return $this->modx->lexicon('user_err_nf');
        } else {
            return $this->modx->lexicon('user') . ': ' . htmlentities($this->user->get('username'));
        }
    }

    /**
     * Return the location of the template file
     * @return string
     */
    public function getTemplateFile()
    {
        return 'security/user/update.tpl';
    }

    /**
     * Specify the language topics to load
     * @return array
     */
    public function getLanguageTopics()
    {
        return ['user', 'setting', 'access'];
    }

    /**
     * Get the Help URL
     * @return string
     */
    public function getHelpUrl()
    {
        return 'Users';
    }
}
