<?php 
 
namespace App\Entity; 
 
use App\Repository\UserRepository; 
use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\Common\Collections\Collection; 
use Doctrine\DBAL\Types\Types; 
use Doctrine\ORM\Mapping as ORM; 
use Gedmo\Timestampable\Traits\TimestampableEntity; 
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; 
use Symfony\Component\Security\Core\User\UserInterface; 
 
#[ORM\Entity(UserRepository::class)] 
#[ORM\Table('`user`')] 
class User implements UserInterface, PasswordAuthenticatedUserInterface 
{ 
    use TimestampableEntity; 
 
    #[ORM\Id] 
    #[ORM\GeneratedValue] 
    #[ORM\Column] 
    private ?int $id; 
 
    #[ORM\Column(length: 180, unique: true)] 
    private ?string $email; 
 
    #[ORM\Column(type: Types::JSON)] 
    private array $roles = []; 
 
    /** 
     * The hashed password 
     */ 
    #[ORM\Column] 
    private ?string $password; 
 
    /** 
     * The plain non-persisted password 
     */ 
    private ?string $plainPassword; 
 
    #[ORM\Column] 
    private bool $enabled = true; 
 
    #[ORM\Column] 
    private ?string $firstName; 
 
    #[ORM\Column] 
    private ?string $lastName; 
 
    #[ORM\Column(nullable: true)] 
    private ?string $avatar; 
 
    #[ORM\OneToMany('askedBy', Question::class)] 
    private Collection $questions; 
 
    #[ORM\OneToMany('answeredBy', Answer::class)] 
    private Collection $answers; 
 
    public function __construct() 
    { 
        $this->questions = new ArrayCollection(); 
        $this->answers = new ArrayCollection(); 
    } 
 
    public function __toString(): string 
    { 
        return $this->getFullName(); 
    } 
 
    public function getId(): ?int 
    { 
        return $this->id; 
    } 
 
    public function getEmail(): ?string 
    { 
        return $this->email; 
    } 
 
    public function setEmail(string $email): self 
    { 
        $this->email = $email; 
 
        return $this; 
    } 
 
    /** 
     * A visual identifier that represents this user. 
     * 
     * @see UserInterface 
     */ 
    public function getUserIdentifier(): string 
    { 
        return (string) $this->email; 
    } 
 
    /** 
     * @deprecated since Symfony 5.3, use getUserIdentifier instead 
     */ 
    public function getUsername(): string 
    { 
        return (string) $this->email; 
    } 
 
    /** 
     * @see UserInterface 
     */ 
    public function getRoles(): array 
    { 
        $roles = $this->roles; 
        // guarantee every user at least has ROLE_USER 
        $roles[] = 'ROLE_USER'; 
 
        return array_unique($roles); 
    } 
 
    public function setRoles(array $roles): self 
    { 
        $this->roles = $roles; 
 
        return $this; 
    } 
 
    /** 
     * @see PasswordAuthenticatedUserInterface 
     */ 
    public function getPassword(): string 
    { 
        return $this->password; 
    } 
 
    public function setPassword(string $password): self 
    { 
        $this->password = $password; 
 
        return $this; 
    } 
 
    public function getPlainPassword(): string 
    { 
        return $this->plainPassword; 
    } 
 
    public function setPlainPassword(string $plainPassword): void 
    { 
        $this->plainPassword = $plainPassword; 
    } 
 
    /** 
     * Returning a salt is only needed, if you are not using a modern 
     * hashing algorithm (e.g. bcrypt or sodium) in your security.yaml. 
     * 
     * @see UserInterface 
     */ 
    public function getSalt(): ?string 
    { 
        return null; 
    } 
 
    /** 
     * @see UserInterface 
     */ 
    public function eraseCredentials() 
    { 
        // If you store any temporary, sensitive data on the user, clear it here 
         $this->plainPassword = null; 
    } 
 
    public function isEnabled(): bool 
    { 
        return $this->enabled; 
    } 
 
    public function setEnabled(bool $enabled): void 
    { 
        $this->enabled = $enabled; 
    } 
 
    public function getFirstName(): ?string 
    { 
        return $this->firstName; 
    } 
 
    public function setFirstName(string $firstName): void 
    { 
        $this->firstName = $firstName; 
    } 
 
    public function getLastName(): ?string 
    { 
        return $this->lastName; 
    } 
 
    public function setLastName(string $lastName): void 
    { 
        $this->lastName = $lastName; 
    } 
 
    public function getFullName(): ?string 
    { 
        return $this->firstName.' '.$this->lastName; 
    } 
 
    public function getAvatar(): ?string 
    { 
        return $this->avatar; 
    } 
 
    public function getAvatarUrl(): ?string 
    { 
        if (!$this->avatar) { 
            return null; 
        } 
 
        if (strpos($this->avatar, '/') !== false) { 
            return $this->avatar; 
        } 
 
        return sprintf('/uploads/avatars/%s', $this->avatar); 
    } 
 
    public function setAvatar(?string $avatar): void 
    { 
        $this->avatar = $avatar; 
    } 
 
    /** 
     * @return Collection|Question[] 
     */ 
    public function getQuestions(): Collection 
    { 
        return $this->questions; 
    } 
 
    public function addQuestion(Question $question): self 
    { 
        if (!$this->questions->contains($question)) { 
            $this->questions[] = $question; 
            $question->setAskedBy($this); 
        } 
 
        return $this; 
    } 
 
    public function removeQuestion(Question $question): self 
    { 
        if ($this->questions->removeElement($question)) { 
            // set the owning side to null (unless already changed) 
            if ($question->getAskedBy() === $this) { 
                $question->setAskedBy(null); 
            } 
        } 
 
        return $this; 
    } 
 
    /** 
     * @return Collection|Answer[] 
     */ 
    public function getAnswers(): Collection 
    { 
        return $this->answers; 
    } 
 
    public function addAnswer(Answer $answer): self 
    { 
        if (!$this->answers->contains($answer)) { 
            $this->answers[] = $answer; 
            $answer->setAnsweredBy($this); 
        } 
 
        return $this; 
    } 
 
    public function removeAnswer(Answer $answer): self 
    { 
        if ($this->answers->removeElement($answer)) { 
            // set the owning side to null (unless already changed) 
            if ($answer->getAnsweredBy() === $this) { 
                $answer->setAnsweredBy(null); 
            } 
        } 
 
        return $this; 
    } 
}