<?php

namespace App\Auth\Entity;

use App\Shared\Context\EntityContext;
use Doctrine\ORM\Mapping as ORM;

use App\Auth\Repository\UserActiveContextRepository;

/**
 * آخرین محیط کاری انتخاب‌شدهٔ کاربر. db_uuid به‌تنهایی نمی‌گوید مالِ کلینیک است یا
 * پزشک، پس db_type هم ذخیره می‌شود تا EntityContextResolver با یک lookup به نتیجه
 * برسد به‌جای اینکه اول کلینیک را امتحان کند و بعد پزشک را.
 */
#[ORM\Entity(repositoryClass: UserActiveContextRepository::class)]
#[ORM\Table(name: 'user_active_context')]
class UserActiveContext
{
    #[ORM\Id]
    #[ORM\OneToOne(targetEntity: User::class)]
    #[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')]
    private User $user;

    #[ORM\Column(name: 'db_uuid', type: 'string', length: 36)]
    private string $dbUuid;

    /** 'doctor' یا 'clinic' — کدام موجودیت را db_uuid آدرس می‌دهد. */
    #[ORM\Column(name: 'db_type', type: 'string', length: 10)]
    private string $dbType;

    #[ORM\Column(name: 'updated_at', type: 'integer')]
    private int $updatedAt;

    public function __construct(User $user, string $dbUuid, string $dbType)
    {
        $this->user      = $user;
        $this->updatedAt = time();
        $this->setContext($dbUuid, $dbType);
    }

    public function getUser(): User     { return $this->user; }
    public function getDbUuid(): string { return $this->dbUuid; }
    public function getDbType(): string { return $this->dbType; }
    public function getUpdatedAt(): int { return $this->updatedAt; }

    public function isClinic(): bool { return $this->dbType === EntityContext::TYPE_CLINIC; }

    /** @throws \InvalidArgumentException اگر نوع محیط یکی از doctor/clinic نباشد */
    public function setContext(string $dbUuid, string $dbType): self
    {
        if (!in_array($dbType, [EntityContext::TYPE_DOCTOR, EntityContext::TYPE_CLINIC], true)) {
            throw new \InvalidArgumentException("Unknown active-context type: {$dbType}");
        }

        $this->dbUuid    = $dbUuid;
        $this->dbType    = $dbType;
        $this->updatedAt = time();

        return $this;
    }
}
