<?php

declare(strict_types=1);

namespace Sabre\CalDAV;

use Sabre\DAV\Sharing;
use Sabre\DAV\Xml\Element\Sharee;

class SharedCalendarTest extends \PHPUnit\Framework\TestCase
{
    protected $backend;

    public function getInstance(array $props = null)
    {
        if (is_null($props)) {
            $props = [
                'id' => 1,
                '{http://calendarserver.org/ns/}shared-url' => 'calendars/owner/original',
                '{http://sabredav.org/ns}owner-principal' => 'principals/owner',
                '{http://sabredav.org/ns}read-only' => false,
                'share-access' => Sharing\Plugin::ACCESS_READWRITE,
                'principaluri' => 'principals/sharee',
            ];
        }

        $this->backend = new Backend\MockSharing(
            [$props],
            [],
            []
        );

        $sharee = new Sharee();
        $sharee->href = 'mailto:removeme@example.org';
        $sharee->properties['{DAV:}displayname'] = 'To be removed';
        $sharee->access = Sharing\Plugin::ACCESS_READ;
        $this->backend->updateInvites(1, [$sharee]);

        return new SharedCalendar($this->backend, $props);
    }

    public function testGetInvites()
    {
        $sharee = new Sharee();
        $sharee->href = 'mailto:removeme@example.org';
        $sharee->properties['{DAV:}displayname'] = 'To be removed';
        $sharee->access = Sharing\Plugin::ACCESS_READ;
        $sharee->inviteStatus = Sharing\Plugin::INVITE_NORESPONSE;

        $this->assertEquals(
            [$sharee],
            $this->getInstance()->getInvites()
        );
    }

    public function testGetOwner()
    {
        $this->assertEquals('principals/sharee', $this->getInstance()->getOwner());
    }

    public function testGetACL()
    {
        $expected = [
            [
                'privilege' => '{DAV:}write',
                'principal' => 'principals/sharee',
                'protected' => true,
            ],
            [
                'privilege' => '{DAV:}write',
                'principal' => 'principals/sharee/calendar-proxy-write',
                'protected' => true,
            ],
            [
                'privilege' => '{DAV:}write-properties',
                'principal' => 'principals/sharee',
                'protected' => true,
            ],
            [
                'privilege' => '{DAV:}write-properties',
                'principal' => 'principals/sharee/calendar-proxy-write',
                'protected' => true,
            ],
            [
                'privilege' => '{DAV:}read',
                'principal' => 'principals/sharee',
                'protected' => true,
            ],
            [
                'privilege' => '{DAV:}read',
                'principal' => 'principals/sharee/calendar-proxy-read',
                'protected' => true,
            ],
            [
                'privilege' => '{DAV:}read',
                'principal' => 'principals/sharee/calendar-proxy-write',
                'protected' => true,
            ],
            [
                'privilege' => '{'.Plugin::NS_CALDAV.'}read-free-busy',
                'principal' => '{DAV:}authenticated',
                'protected' => true,
            ],
        ];

        $this->assertEquals($expected, $this->getInstance()->getACL());
    }

    public function testGetChildACL()
    {
        $expected = [
            [
                'privilege' => '{DAV:}write',
                'principal' => 'principals/sharee',
                'protected' => true,
            ],
            [
                'privilege' => '{DAV:}write',
                'principal' => 'principals/sharee/calendar-proxy-write',
                'protected' => true,
            ],
            [
                'privilege' => '{DAV:}read',
                'principal' => 'principals/sharee',
                'protected' => true,
            ],
            [
                'privilege' => '{DAV:}read',
                'principal' => 'principals/sharee/calendar-proxy-write',
                'protected' => true,
            ],
            [
                'privilege' => '{DAV:}read',
                'principal' => 'principals/sharee/calendar-proxy-read',
                'protected' => true,
            ],
        ];

        $this->assertEquals($expected, $this->getInstance()->getChildACL());
    }

    public function testUpdateInvites()
    {
        $instance = $this->getInstance();
        $newSharees = [
            new Sharee(),
            new Sharee(),
        ];
        $newSharees[0]->href = 'mailto:test@example.org';
        $newSharees[0]->properties['{DAV:}displayname'] = 'Foo Bar';
        $newSharees[0]->comment = 'Booh';
        $newSharees[0]->access = Sharing\Plugin::ACCESS_READWRITE;

        $newSharees[1]->href = 'mailto:removeme@example.org';
        $newSharees[1]->access = Sharing\Plugin::ACCESS_NOACCESS;

        $instance->updateInvites($newSharees);

        $expected = [
            clone $newSharees[0],
        ];
        $expected[0]->inviteStatus = Sharing\Plugin::INVITE_NORESPONSE;
        $this->assertEquals($expected, $instance->getInvites());
    }

    public function testPublish()
    {
        $instance = $this->getInstance();
        $this->assertNull($instance->setPublishStatus(true));
        $this->assertNull($instance->setPublishStatus(false));
    }
}
