/home/ivoiecob/email.hirewise-va.com/system/Module/Settings.php
<?php
/**
 * This code is licensed under AGPLv3 license or Afterlogic Software License
 * if commercial version of the product was purchased.
 * For full statements of the licenses see LICENSE-AFTERLOGIC and LICENSE-AGPL3 files.
 */

namespace Aurora\System\Module;

use Aurora\System\Api;

/**
 * @license https://www.gnu.org/licenses/agpl-3.0.html AGPL-3.0
 * @license https://afterlogic.com/products/common-licensing Afterlogic Software License
 * @copyright Copyright (c) 2019, Afterlogic Corp.
 *
 * @package Api
 */
class Settings extends \Aurora\System\AbstractSettings
{
    /**
     * @var \Aurora\System\Module\TenantSettings[]
     */
    protected $aTenantSettings = [];

    /**
     * @var string
     */
    public $ModuleName;

    /**
     * @param string $sModuleName
     */
    public function __construct($sModuleName)
    {
        $this->ModuleName = $sModuleName;

        parent::__construct(
            Api::GetModuleManager()->GetModulesSettingsPath() . $sModuleName . '.config.json'
        );

        $this->initDefaults();
    }

    protected function initDefaults()
    {
        $this->aContainer = [];
    }

    /**
     * @param string $sTenantName
     *
     * @return \Aurora\System\Module\TenantSettings
     */
    public function GetTenantSetttings($sTenantName)
    {
        if (!isset($this->aTenantSettings[$sTenantName])) {
            $oTenantSettings = new TenantSettings(
                $this->ModuleName,
                $sTenantName
            );
            $oTenantSettings->Load();
            $this->aTenantSettings[$sTenantName] = $oTenantSettings;
        }

        return isset($this->aTenantSettings[$sTenantName]) ? $this->aTenantSettings[$sTenantName] : null;
    }

    /**
     * @param string $sName
     * @param mixed $sDefaultValue
     *
     * @return mixed
     */
    public function GetValue($sName, $sDefaultValue = null)
    {
        return $this->GetTenantValue(Api::getTenantName(), $sName, $sDefaultValue);
    }

    /**
     * @param string $sTenantName
     * @param string $sName
     * @param mixed $sDefaultValue
     *
     * @return mixed
     */
    public function GetTenantValue($sTenantName, $sName, $sDefaultValue = null)
    {
        $mResult = parent::GetValue($sName, $sDefaultValue);

        if ($this->IsTenantSettingsExists($sTenantName)) {
            $oTenantSettings = $this->GetTenantSetttings($sTenantName);
            if ($oTenantSettings !== null && isset($oTenantSettings->{$sName})) {
                $mResult = $oTenantSettings->GetValue($sName, $sDefaultValue);
            }
        }

        return $mResult;
    }

    public function SaveTenantSettings($sTenantName, $aValues = [])
    {
        $mResult = false;
        $oTenantSettings =  $this->GetTenantSetttings($sTenantName);
        foreach ($aValues as $key => $value) {
            if (!isset($oTenantSettings->{$key}) && isset($this->aContainer[$key])) {
                $oTenantSettings->SetProperty($key, $this->aContainer[$key]);
            }
            $oTenantSettings->SetValue($key, $value);
        }
        if ($oTenantSettings !== null) {
            $mResult = $oTenantSettings->Save();
        }

        return $mResult;
    }

    public function IsTenantSettingsExists($sTenantName)
    {
        return \file_exists(Api::GetModuleManager()->GetModulesSettingsPath() . 'tenants/' . $sTenantName . '/' . $this->ModuleName . '.config.json');
    }
}