<?php

namespace App\Resource\Controller;

use App\Auth\Entity\User;
use App\Clinic\Security\ClinicDoctorAccessChecker;
use App\Secretary\Security\SecretaryAccessChecker;
use Symfony\Contracts\Service\Attribute\Required;

/**
 * گِیتِ مشترک چهار کنترلر این دامنه.
 *
 * مجوز `appointment_settings` بازاستفاده می‌شود و مجوز تازه‌ای ساخته نمی‌شود: منابع
 * بخشی از پیکربندی نوبت‌دهی‌اند و افزودن یک کلید تازه یعنی یک ستون تازه در جدول
 * مجوزهای هر منشی و هر پزشکِ عضو، بدون اینکه کسی خواسته باشد آن‌ها را جدا کند.
 */
trait ResourcePermissionTrait
{
    private SecretaryAccessChecker    $secretaryAccess;
    private ClinicDoctorAccessChecker $clinicDoctorAccess;

    #[Required]
    public function setResourceAccessCheckers(
        SecretaryAccessChecker $secretaryAccess,
        ClinicDoctorAccessChecker $clinicDoctorAccess,
    ): void {
        $this->secretaryAccess    = $secretaryAccess;
        $this->clinicDoctorAccess = $clinicDoctorAccess;
    }

    /** @param 'view'|'update' $action */
    private function denyUnlessGranted(User $user, string $action): void
    {
        $this->secretaryAccess->denyUnlessGranted($user, 'appointment_settings', $action);
        $this->clinicDoctorAccess->denyUnlessGranted($user, 'appointment_settings', $action);
    }
}
