<?php

namespace App\Course\Service;

use App\Course\Entity\CourseSession;
use App\Course\Entity\TreatmentCourse;

/**
 * پیشرفت دوره — «جلسهٔ ۳ از ۸».
 *
 * شمارش از خودِ جلسات می‌آید نه از یک شمارنده؛ همان دلیل دفتر اعتبار تسک ۱۱: عددی که
 * جدا از داده نگه داشته شود، بالاخره با آن اختلاف پیدا می‌کند.
 */
final class CourseProgressCalculator
{
    /** @return array<string, mixed> */
    public function progressOf(TreatmentCourse $course): array
    {
        $byStatus = [
            CourseSession::STATUS_PLANNED   => 0,
            CourseSession::STATUS_BOOKED    => 0,
            CourseSession::STATUS_COMPLETED => 0,
            CourseSession::STATUS_SKIPPED   => 0,
        ];

        $next = null;

        foreach ($course->getSessions() as $session) {
            $byStatus[$session->getStatus()]++;

            if ($session->getStatus() === CourseSession::STATUS_PLANNED
                && ($next === null || $session->getSessionNumber() < $next->getSessionNumber())
            ) {
                $next = $session;
            }
        }

        return [
            'completed'           => $byStatus[CourseSession::STATUS_COMPLETED],
            'booked'              => $byStatus[CourseSession::STATUS_BOOKED],
            'planned'             => $byStatus[CourseSession::STATUS_PLANNED],
            'skipped'             => $byStatus[CourseSession::STATUS_SKIPPED],
            'total'               => $course->getSessionCount(),
            'next_session_number' => $next?->getSessionNumber(),
            'next_params'         => (object) ($next?->getParams() ?? []),
            'last_completed_at'   => $course->lastCompletedAt(),
        ];
    }
}
