<?php

namespace App\Appointment\Plan\ValueObject;

/**
 * برنامهٔ یک نوبت: بخش‌های پشت‌سرهم با آفست، مدت و نیازمندی منبع.
 *
 * هنوز هیچ زمان مطلق و هیچ منبع مشخصی ندارد — آن کارِ تسک ۰۶ است. این فقط «شکل»
 * نوبت است.
 */
final readonly class AppointmentPlan
{
    /** @param list<PlannedSegment> $segments */
    public function __construct(
        public array $segments,
        public int $totalMinutes,
    ) {}

    /**
     * مدتی که بیمار واقعاً روی صندلی است.
     *
     * با `total_minutes` فرق دارد و همین تفاوت است که به بیمار گفته می‌شود: نوبتِ
     * نودقیقه‌ای که چهل دقیقه‌اش انتظار اثر بی‌حسی است، «نود دقیقه وقت بگذارید» نیست.
     * محاسبه‌اش یک‌جا اینجاست تا هر کلاینت خودش جمع نزند.
     */
    public function patientFacingMinutes(): int
    {
        return array_sum(array_map(
            static fn (PlannedSegment $s): int => $s->patientPresent ? $s->durationMinutes : 0,
            $this->segments,
        ));
    }

    public function toArray(): array
    {
        return [
            'total_minutes'          => $this->totalMinutes,
            'patient_facing_minutes' => $this->patientFacingMinutes(),
            'segments'               => array_map(
                static fn (PlannedSegment $s): array => $s->toArray(),
                $this->segments,
            ),
        ];
    }
}
