<?php

namespace App\Appointment\Plan\ValueObject;

use App\Resource\Entity\ClinicResource;

/**
 * یک نیازمندیِ حل‌شده: چه نقشی، چند تا، با چه اشغالی، و **چند منبع واجد شرایط**.
 *
 * `candidates` عدد است نه فهرست: تسک ۰۶ خودش منابع را دوباره و با در نظر گرفتن زمان
 * پیدا می‌کند؛ اینجا فقط برای پاسخ انسانیِ «هیچ اپراتور خانمی با مهارت لیزر در این
 * شعبه نیست» لازم است (بند ۱۰ مستند).
 */
final readonly class PlannedRequirement
{
    /**
     * @param list<string>         $constraints
     * @param list<ClinicResource> $eligible منابعی که همین حالا شرایط را دارند
     */
    public function __construct(
        public string $role,
        public string $roleName,
        public int $count,
        public string $occupancy,
        public array $constraints,
        public array $eligible,
        public ?string $skillName = null,
        public int $setupMinutes = 0,
        public int $cleanupMinutes = 0,
    ) {}

    public function candidates(): int
    {
        return count($this->eligible);
    }

    public function toArray(): array
    {
        return [
            'role'        => $this->role,
            'role_name'   => $this->roleName,
            'skill_name'  => $this->skillName,
            'count'       => $this->count,
            'occupancy'   => $this->occupancy,
            'constraints' => $this->constraints,
            'candidates'  => $this->candidates(),
            // تسک ۰۶ بازهٔ اشغال را از همین می‌سازد؛ در نمای کاربر نشان داده نمی‌شود.
            'occupancy_offset' => [
                'setup_minutes'   => $this->setupMinutes,
                'cleanup_minutes' => $this->cleanupMinutes,
            ],
        ];
    }
}
