<?php

date_default_timezone_set('Europe/Bucharest');

$pdo = new PDO('sqlite:data/db.sqlite');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$publicDir = 'public';
$tmpDir = 'tmpdata';

// The autoloader
require 'vendor/autoload.php';

// Set IMAP flags according to your needs.
// The connection will be opened read-only.
// http://php.net/manual/de/function.imap-open.php
$mailbox = '{mail.magiclane.com:993/ssl}';

// Creating the backend.
$authBackend = new \Sabre\DAV\Auth\Backend\IMAP($mailbox);
$principalBackend = new \Sabre\DAVACL\PrincipalBackend\PDO($pdo);
$storageBackend = new \Sabre\DAV\PropertyStorage\Backend\PDO($pdo);
$carddavBackend = new \Sabre\CardDAV\Backend\PDO($pdo);
$caldavBackend = new \Sabre\CalDAV\Backend\PDO($pdo);

$nodes = [
    // /principals
    new \Sabre\CalDAV\Principal\Collection($principalBackend),
    // /calendars
    new \Sabre\CalDAV\CalendarRoot($principalBackend, $caldavBackend),
    // /addressbook
    new \Sabre\CardDAV\AddressBookRoot($principalBackend, $carddavBackend),
    // Create the WebDav root node
    new \Sabre\DAV\FS\Directory($publicDir),
];

// The object tree needs in turn to be passed to the server class
$server = new \Sabre\DAV\Server($nodes);

// Plugins
$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend));

// The lock manager is reponsible for making sure users don't overwrite
// each others changes.
$lockBackend = new \Sabre\DAV\Locks\Backend\File($tmpDir.'/locksdb');
$server->addPlugin(new \Sabre\DAV\Locks\Plugin($lockBackend));
// Automatically guess (some) contenttypes, based on extension
$server->addPlugin(new \Sabre\DAV\Browser\GuessContentType());
// Temporary file filter
$server->addPlugin(new \Sabre\DAV\TemporaryFileFilterPlugin($tmpDir));
$server->addPlugin(new \Sabre\DAV\Mount\Plugin());
$server->addPlugin(new \Sabre\DAV\PropertyStorage\Plugin($storageBackend));

// This ensures that we get a pretty index in the browser, but it is
// optional.
$server->addPlugin(new \Sabre\DAV\Browser\Plugin());

// sync plugin
$server->addPlugin(new \Sabre\DAV\Sync\Plugin());
// sharing plugin
$server->addPlugin(new \Sabre\DAV\Sharing\Plugin());

$aclPlugin = new \Sabre\DAVACL\Plugin();
$aclPlugin->adminPrincipals[] = 'principals/jszilagyi@generalmagic.com';
$aclPlugin->hideNodesFromListings = true;
$server->addPlugin($aclPlugin);

// CalDAV plugins
$server->addPlugin(new \Sabre\CalDAV\Plugin());
$server->addPlugin(new \Sabre\CalDAV\Subscriptions\Plugin());
$server->addPlugin(new \Sabre\CalDAV\Schedule\Plugin());
$server->addPlugin(new \Sabre\CalDAV\SharingPlugin());
$server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin());

// CardDAV plugins
$server->addPlugin(new \Sabre\CardDAV\Plugin());
$server->addPlugin(new \Sabre\CardDAV\VCFExportPlugin());

// All we need to do now, is to fire up the server
$server->start();
