/home/ivoiecob/email.hirewise-va.com/vendor/afterlogic/dav/lib/DAV/CardDAV/AddressBookRoot.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 Afterlogic\DAV\CardDAV;

use Afterlogic\DAV\Constants;
use Aurora\Modules\Contacts\Enums\Access;
use Afterlogic\DAV\Backend;
use Afterlogic\DAV\Server;

/**
 * @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.
 */
class AddressBookRoot extends \Sabre\CardDAV\AddressBookHome
{
    protected $isEmpty = false;

    public function setEmpty($isEmpty)
    {
        $this->isEmpty = $isEmpty;
    }

    public function getName()
    {
        return 'addressbooks';
    }

    public function __construct(\Sabre\CardDAV\Backend\BackendInterface $caldavBackend, $principalInfo = null)
    {
        parent::__construct($caldavBackend, $principalInfo);
    }

    public function init()
    {
        if (!isset($this->principalUri)) {
            $sUserPublicId = \Afterlogic\DAV\Server::getUser();

            if (!empty($sUserPublicId)) {
                $principalInfo = \Afterlogic\DAV\Server::getPrincipalInfo($sUserPublicId);
                if (is_array($principalInfo)) {
                    $this->principalUri = $principalInfo['uri'];
                }
            }
        }
    }

    public function getACL()
    {
        $this->init();

        return parent::getACL();
    }

    public function getChild($name)
    {
        $this->init();
        if ($name === Constants::ADDRESSBOOK_DEFAULT_NAME || $name === Constants::ADDRESSBOOK_COLLECTED_NAME) {
            $abook = false;
            if ($this->carddavBackend instanceof \Afterlogic\DAV\CardDAV\Backend\PDO) {
                $abook = $this->carddavBackend->getAddressBookForUser($this->principalUri, $name);
            }
            if (!$abook && isset($this->principalUri)) {
                $this->carddavBackend->createAddressBook(
                    $this->principalUri,
                    $name,
                    [
                        '{DAV:}displayname' => $name === Constants::ADDRESSBOOK_DEFAULT_NAME ? Constants::ADDRESSBOOK_DEFAULT_DISPLAY_NAME : Constants::ADDRESSBOOK_COLLECTED_DISPLAY_NAME
                    ]
                );
            }
        }
        return parent::getChild($name);
    }

    /**
     * Returns a list of addressbooks
     *
     * @return array
     */
    public function getChildren()
    {
        $this->init();
        $objs = [];

        if ($this->isEmpty) {
            return $objs;
        }

        $aAddressbooks = $this->carddavBackend->getAddressbooksForUser($this->principalUri);
        if (count($aAddressbooks) === 0 && isset($this->principalUri)) {
            $this->carddavBackend->createAddressBook(
                $this->principalUri,
                Constants::ADDRESSBOOK_DEFAULT_NAME,
                [
                    '{DAV:}displayname' => Constants::ADDRESSBOOK_DEFAULT_DISPLAY_NAME
                ]
            );
            $this->carddavBackend->createAddressBook(
                $this->principalUri,
                Constants::ADDRESSBOOK_COLLECTED_NAME,
                [
                    '{DAV:}displayname' => Constants::ADDRESSBOOK_COLLECTED_DISPLAY_NAME
                ]
            );
            $aAddressbooks = $this->carddavBackend->getAddressbooksForUser($this->principalUri);
        }
        foreach ($aAddressbooks as $addressbook) {
            if ($addressbook['uri'] === 'Collected') {
                $objs[] = new Collected\AddressBook(
                    $this->carddavBackend,
                    $addressbook
                );
            } else {
                $objs[] = new AddressBook(
                    $this->carddavBackend,
                    $addressbook
                );
            }
        }
        $SharedContactsModule = \Aurora\System\Api::GetModule('SharedContacts');
        if ($SharedContactsModule && !$SharedContactsModule->getConfig('Disabled', true)) {
            if ($this->carddavBackend instanceof Backend\PDO) {

                $sharedWithAllAddressbook = $this->carddavBackend->getSharedWithAllAddressBook($this->principalUri);
                $objs[] = new SharedWithAll\AddressBook(
                    $this->carddavBackend,
                    $sharedWithAllAddressbook,
                    $this->principalUri
                );

                $sharedAddressbooks = $this->carddavBackend->getSharedAddressBooks($this->principalUri);
                foreach ($sharedAddressbooks as $sharedAddressbook) {
                    if ($sharedAddressbook['principaluri'] != $this->principalUri) {
                        if (count($objs) > 0) {
                            foreach ($objs as $key => $val) {
                                if ($val instanceof Shared\AddressBook) {
                                    $props = $val->getProperties(['id', 'access' ,'group_id']);
                                    if ($props['id'] === $sharedAddressbook['id']) { // personal sharing
                                        if ($sharedAddressbook['group_id'] == 0) {
                                            $objs[$key]->setAccess((int) $sharedAddressbook['access']);
                                        } else { //group sharing
                                            if ($sharedAddressbook['access'] != Access::Read) {
                                                if ((int) $props['access'] > (int) $sharedAddressbook['access'] || (int) $sharedAddressbook['access'] === Access::NoAccess) {
                                                    $objs[$key]->setAccess((int) $sharedAddressbook['access']);
                                                }
                                            } elseif ($props['access'] != Access::Write) {
                                                $objs[$key]->setAccess((int) $sharedAddressbook['access']);
                                            }
                                        }
                                        continue 2;
                                    }
                                }
                            }
                        }

                        $objs[] = new Shared\AddressBook(
                            $this->carddavBackend,
                            $sharedAddressbook,
                            $this->principalUri
                        );
                    }
                }
            }
            $objs = array_filter($objs, function ($obj) {
                return !($obj instanceof Shared\AddressBook) || ($obj instanceof Shared\AddressBook && $obj->getAccess() != Access::NoAccess);
            });
        }

        $TeamContactsModule = \Aurora\System\Api::GetModule('TeamContacts');
        if ($TeamContactsModule && !$SharedContactsModule->getConfig('Disabled', true)) {
            $oUser = Server::getUserObject();
            if ($oUser) {
                $sPrincipalUri = Constants::PRINCIPALS_PREFIX . $oUser->IdTenant . '_' . Constants::DAV_TENANT_PRINCIPAL;
                $addressbookInfo = Backend::Carddav()->getAddressBookForUser($sPrincipalUri, 'gab');
                if ($addressbookInfo) {
                    $objs[] = new GAB\AddressBook($this->carddavBackend, $addressbookInfo);
                }
            }
        }

        return $objs;
    }
}