<?php

namespace AutoAdmin\Bundle\Admin\Model;

use AutoAdmin\Bundle\Content\Entity\Site;
use AutoAdmin\Bundle\Content\Model\CreatedAtInterface;
use AutoAdmin\Bundle\Content\Model\IdInterface;
use AutoAdmin\Bundle\Content\Model\UpdatedAtInterface;
use DateTime;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;

interface AdministratorInterface extends
    IdInterface,
    UserInterface,
    PasswordAuthenticatedUserInterface,
    CreatedAtInterface,
    UpdatedAtInterface
{
    const ACCOUNT_TYPE_LOCAL = 'local';
    const ACCOUNT_TYPE_SSO = 'sso';
    const ACCOUNT_TYPE_DEFAULT = self::ACCOUNT_TYPE_LOCAL;

    public function getEmail(): string;

    public function setEmail(string $email): self;

    public function getUsername(): string;

    public function setUsername(string $username): self;

    public function getAccountType(): string;

    public function setAccountType(string $accountType): self;

    public function addRole(string $role): void;

    public function removeRole(string $role): void;

    public function setRoles(array $roles): self;

    public function hasRole(string $role): bool;

    public function setPassword(string $password): self;

    public function getPlainPassword(): ?string;

    public function setPlainPassword(?string $plainPassword): self;

    public function getSalt();


    public function onUpdate(): void;

    public function getLastLoggedAt(): ?DateTime;

    public function setLastLoggedAt(?DateTime $dateTime): self;

    public function getEnabled(): bool;

    public function setEnabled(bool $enabled): self;

    public function getPasswordRequestToken(): ?string;

    public function setPasswordRequestToken(?string $token): self;

    public function getPasswordRequestAt(): ?DateTime;

    public function setPasswordRequestAt(?DateTime $time): self;

    public function getAdministratorSites(): Collection;

    public function addAdministratorSite(Site $administratorSite): self;

    public function removeAdministratorSite(Site $administratorSite): self;
}
