<?php

namespace OCA\BigBlueButton\Db;

use JsonSerializable;

use OCP\AppFramework\Db\Entity;

/**
 * @method string getUid()
 * @method string getName()
 * @method string getAttendeePassword()
 * @method string getModeratorPassword()
 * @method string getWelcome()
 * @method int getMaxParticipants()
 * @method bool getRecord()
 * @method string getUserId()
 * @method string getAccess()
 * @method string getPassword()
 * @method bool getEveryoneIsModerator()
 * @method bool getRequireModerator()
 * @method bool getEveryoneIsModerator()
 * @method string getModeratorToken()
 * @method bool getListenOnly()
 * @method bool getMediaCheck()
 * @method bool getCleanLayout()
 * @method bool getJoinMuted()
 * @method void setUid(string $uid)
 * @method void setName(string $name)
 * @method void setAttendeePassword(string $pw)
 * @method void setModeratorPassword(string $pw)
 * @method void setWelcome(string $welcome)
 * @method void setMaxParticipants(int $max)
 * @method void setRecord(bool $record)
 * @method void setUserId(string $userId)
 * @method void setAccess(string $access)
 * @method void setPassword(string $pw)
 * @method void setEveryoneIsModerator(bool $everyone)
 * @method void setRequireModerator(bool $require)
 * @method void setModeratorToken(string $moderatorToken)
 * @method void setListenOnly(bool $listenOnly)
 * @method void setMediaCheck(bool $mediaCheck)
 * @method void setCleanLayout(bool $cleanLayout)
 * @method void setJoinMuted(bool $joinMuted)
 */
class Room extends Entity implements JsonSerializable {
	public const ACCESS_PUBLIC = 'public';
	public const ACCESS_PASSWORD = 'password';
	public const ACCESS_WAITING_ROOM = 'waiting_room';
	public const ACCESS_INTERNAL = 'internal';
	public const ACCESS_INTERNAL_RESTRICTED = 'internal_restricted';

	public const ACCESS = [self::ACCESS_PUBLIC, self::ACCESS_PASSWORD, self::ACCESS_WAITING_ROOM, self::ACCESS_INTERNAL, self::ACCESS_INTERNAL_RESTRICTED];

	public $uid;
	public $name;
	public $attendeePassword;
	public $moderatorPassword;
	public $welcome;
	public $maxParticipants;
	public $record;
	public $userId;
	public $access = self::ACCESS_PUBLIC;
	public $password;
	public $everyoneIsModerator;
	public $requireModerator = false;
	public $shared = false;
	public $moderatorToken;
	public $listenOnly;
	public $mediaCheck;
	public $cleanLayout;
	public $joinMuted;

	public function __construct() {
		$this->addType('maxParticipants', 'integer');
		$this->addType('record', 'boolean');
		$this->addType('everyoneIsModerator', 'boolean');
		$this->addType('requireModerator', 'boolean');
		$this->addType('shared', 'boolean');
		$this->addType('listenOnly', 'boolean');
		$this->addType('mediaCheck', 'boolean');
		$this->addType('cleanLayout', 'boolean');
		$this->addType('joinMuted', 'boolean');
	}

	public function jsonSerialize(): array {
		return [
			'id' => $this->id,
			'uid' => $this->uid,
			'userId' => $this->userId,
			'name' => $this->name,
			'welcome' => $this->welcome,
			'maxParticipants' => (int) $this->maxParticipants,
			'record' => boolval($this->record),
			'access' => $this->access,
			'password' => $this->password,
			'everyoneIsModerator' => boolval($this->everyoneIsModerator),
			'requireModerator' => boolval($this->requireModerator),
			'shared' => boolval($this->shared),
			'moderatorToken' => $this->moderatorToken,
			'listenOnly' => boolval($this->listenOnly),
			'mediaCheck' => boolval($this->mediaCheck),
			'cleanLayout' => boolval($this->cleanLayout),
			'joinMuted' => boolval($this->joinMuted),
		];
	}
}