<?php

namespace App\Patient\Security;

/**
 * محیطی که پرونده‌های بیمار در آن خوانده/نوشته می‌شوند، به‌همراه محدودیت اختیاریِ
 * «فقط بیمارانِ این پزشک(ها)».
 *
 * پروندهٔ کلینیکی per-بیمار است نه per-پزشک (یکتایی clinic+user)، پس محدودسازیِ
 * پزشکِ عضو نمی‌تواند روی خودِ پرونده باشد؛ از مسیر نوبت‌های همان پزشک در همان
 * کلینیک استخراج می‌شود.
 */
final class PatientRecordScope
{
    /** @param int[]|null $restrictToDoctorIds null یعنی بدون محدودیت (مدیر/مالک) */
    private function __construct(
        public readonly string $entityType,
        public readonly ?int   $entityId,
        public readonly ?array $restrictToDoctorIds,
    ) {}

    public static function forDoctor(?int $doctorId): self
    {
        return new self('doctor', $doctorId, null);
    }

    /** مدیر کلینیک: همهٔ پرونده‌های کلینیک. */
    public static function forClinic(?int $clinicId): self
    {
        return new self('clinic', $clinicId, null);
    }

    /**
     * پزشک عضو یا منشی: پرونده‌های کلینیک، محدود به بیمارانِ این پزشک(ها).
     * لیست خالی یعنی هیچ پزشکی تخصیص نیافته ⇒ هیچ پرونده‌ای.
     *
     * @param int[] $doctorIds
     */
    public static function forClinicRestrictedToDoctors(int $clinicId, array $doctorIds): self
    {
        return new self('clinic', $clinicId, array_values(array_unique($doctorIds)));
    }

    public static function unknown(): self
    {
        return new self('unknown', null, null);
    }

    public function isRestricted(): bool
    {
        return $this->restrictToDoctorIds !== null;
    }

    /** @return array{0: string, 1: int|null} سازگار با امضای قدیمیِ resolveEntity. */
    public function toLegacyTuple(): array
    {
        return [$this->entityType, $this->entityId];
    }
}
