/home/ivoiecob/email.hirewise-va.com/modules/CorporateCalendar/Module.php
<?php
/**
 * This code is licensed under Afterlogic Software License.
 * For full statements of the license see LICENSE file.
 */

namespace Aurora\Modules\CorporateCalendar;

/**
 * @license https://afterlogic.com/products/common-licensing Afterlogic Software License
 * @copyright Copyright (c) 2023, Afterlogic Corp.
 *
 * @property Settings $oModuleSettings
 *
 * @package Modules
 */
class Module extends \Aurora\System\Module\AbstractLicensedModule
{
    public $oManager = null;

    public function getManager()
    {
        if ($this->oManager === null) {
            $this->oManager = new \Aurora\Modules\Calendar\Manager($this);
        }

        return $this->oManager;
    }

    public function init()
    {
        $this->subscribeEvent('Calendar::GetCalendars::after', array($this, 'onAfterGetCalendars'));
    }

    /**
     * @return Module
     */
    public static function getInstance()
    {
        return parent::getInstance();
    }

    /**
     * @return Module
     */
    public static function Decorator()
    {
        return parent::Decorator();
    }

    /**
     * @return Settings
     */
    public function getModuleSettings()
    {
        return $this->oModuleSettings;
    }

    public function GetSettings()
    {
        \Aurora\System\Api::checkUserRoleIsAtLeast(\Aurora\System\Enums\UserRole::Anonymous);

        return array(
            'AllowShare' => $this->oModuleSettings->AllowShare
        );
    }

    /**
     *
     * @param int $UserId
     * @param string $Id
     * @param boolean $IsPublic
     * @param array $Shares
     * @param boolean $ShareToAll
     * @param int $ShareToAllAccess
     * @return array|boolean
     */
    public function UpdateCalendarShare($UserId, $Id, $IsPublic, $Shares, $ShareToAll = false, $ShareToAllAccess = \Aurora\Modules\Calendar\Enums\Permission::Read)
    {
        \Aurora\System\Api::checkUserRoleIsAtLeast(\Aurora\System\Enums\UserRole::NormalUser);
        $sUserPublicId = \Aurora\System\Api::getUserPublicIdById($UserId);
        $aShares = json_decode($Shares, true) ;

        // Share calendar to all users
        if ($ShareToAll) {
            $aShares[] = array(
                'email' => $this->getManager()->getTenantUser(),
                'access' => $ShareToAllAccess
            );
        } else {
            $aShares[] = array(
                'email' => $this->getManager()->getTenantUser(),
                'access' => \Aurora\Modules\Calendar\Enums\Permission::RemovePermission
            );
        }

        // Public calendar
        if ($IsPublic) {
            $aShares[] = array(
                'email' => $this->getManager()->getPublicUser(),
                'access' => \Aurora\Modules\Calendar\Enums\Permission::Read
            );
        }
        return $this->getManager()->updateCalendarShares($sUserPublicId, $Id, $aShares);
    }

    public function onAfterGetCalendars($aData, &$oResult)
    {
        if (isset($aData['UserId']) && isset($oResult['Calendars'])) {
            $oUser = \Aurora\System\Api::getUserById($aData['UserId']);
            if ($oUser) {
                $mCalendars = $this->getManager()->getSharedCalendars($oUser->PublicId);
                if (is_array($mCalendars)) {
                    foreach ($mCalendars as $CalendarKey => $oCalendar) {
                        foreach ($oCalendar->Shares as $ShareKey => $aShare) {
                            if ($aShare['email'] === $this->getManager()->getTenantUser()) {
                                if (!$oCalendar->SharedToAll) {
                                    $mCalendars[$CalendarKey]->Shared = true;
                                    $mCalendars[$CalendarKey]->SharedToAll = true;
                                } elseif ($oUser->PublicId === $oCalendar->Owner) {
                                    unset($mCalendars[$CalendarKey]);
                                }
                                unset($oCalendar->Shares[$ShareKey]);
                            }
                        }
                    }
                    $oResult['Calendars'] = array_merge($oResult['Calendars'], $mCalendars);
                }
            }
        }
    }
}