<?php
namespace App\Entity;

use App\Helper\StringGenerationHelper;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Entity for workspaces
 */
class ActorEntity
{

    /** @var string The unique identifier of the entity */
    protected $id = '';

    /** @var string The first name of the actof */
    protected $firstName = '';

    /** @var string The last name of the actor */
    protected $lastName = '';

    /** @var string|null The optional nickname of the actor, if not set, the display name will be Firstname LASTNAME */
    protected $nickname = null;

    /** @var bool If the actor is still active, if set to false, he will not be proposed when setting and actor to a taks or activity */
    protected $active = True;

    /** @var bool If the actor is followed, if set to true, it will apear on top of choices and on home page */
    protected $followed = False;

    /**
     * Init entity
     */
    public function __construct()
    {
        $this->activities = new ArrayCollection();
    }

    /**
     * Get the unique ID the entity
     *
     * @return string
     */
    public function getId(): string
    {
        return $this->id;
    }

    /**
     * Set the ID of the entity
     * <br/> This should not be done after creation
     *
     * @param string $id
     * @return self
     */
    public function setId(string $id): self
    {
        $this->id = $id;

        return $this;
    }

    /**
     * Generate and save a random ID
     *
     * @return string Generated ID
     */
    public function generateId(): string
    {
        // Generate ID
        $id = StringGenerationHelper::generateString(array_merge(range('a', 'z'), range('A', 'Z'), range('0', '9')), 8);

        // Save and return
        $this->setId($id);
        return $id;
    }

    /**
     * Get the first name of the actor
     *
     * @return string
     */
    public function getFirstName(): string
    {
        return $this->firstName;
    }

    /**
     * Set the first name of the actor
     *
     * @param string $firstName
     * @return self
     */
    public function setFirstName(string $firstName): self
    {
        $this->firstName = $firstName;

        return $this;
    }

    /**
     * Get the last name of the actor
     *
     * @return string
     */
    public function getLastName(): string
    {
        return $this->lastName;
    }

    /**
     * Set the last name of the actor
     *
     * @param string $lastName
     * @return self
     */
    public function setLastName(string $lastName): self
    {
        $this->lastName = $lastName;

        return $this;
    }

    /**
     * Get the formated version of the full name (Firstname LASTNAME)
     *
     * @return string
     */
    public function getFullName(): string
    {
        return sprintf('%s %s', ucfirst(strtolower($this->firstName)), strtoupper($this->lastName));
    }

    /**
     * Get the nickname of the actor
     *
     * @return string|null
     */
    public function getNickname(): string
    {
        return $this->nickname;
    }

    /**
     * Set the nickname name of the actor
     *
     * @param string $nickname
     * @return self
     */
    public function setNickname(string $nickname): self
    {
        $this->nickname = $nickname;

        return $this;
    }

    /**
     * Get the display name of the actor.
     * Equals nickname if set, Firstname LASTNAME else.
     *
     * @return string
     */
    public function getDisplayName(): string
    {
        return empty($this->nickname) ? $this->getFullName() : $this->nickname;
    }

    /**
     * If the actor is active
     *
     * @return bool
     */
    public function getActive(): bool
    {
        return $this->active;
    }

    /**
     * Set the active status of the actor
     *
     * @param bool $active
     * @return self
     */
    public function setActive(bool $active): self
    {
        $this->active = $active;

        return $this;
    }

    /**
     * If the actor is followed
     *
     * @return bool
     */
    public function getFollowed(): bool
    {
        return $this->followed;
    }

    /**
     * Set the followed status of the actor
     *
     * @param bool $followed
     * @return self
     */
    public function setFollowed(bool $followed): self
    {
        $this->followed = $followed;

        return $this;
    }
}