<?php

namespace App\Appointment\Service;

use App\Clinic\Entity\Clinic;
use App\Clinic\Repository\ClinicRepository;
use App\Doctor\Entity\Doctor;
use App\Shared\Constant\ErrorCodes;
use App\Shared\Exception\AppException;

/**
 * محل نوبت‌دهی یک درخواست: کلینیکِ داده‌شده، یا null یعنی مطب شخصی پزشک.
 *
 * نبودِ clinic_uuid هرگز به معنی «هر محلی که پیدا شد» نیست. با چند برنامهٔ هم‌زمان،
 * حدس‌زدن محل یعنی ثبت خاموشِ نوبت در جای اشتباه — پس یا محل صریح است، یا شخصی.
 *
 * چرا جدا از {@see \App\Shared\Context\EntityContextResolver}: ورودی آن User است و
 * محیطِ کاربرِ پنل را حل می‌کند؛ اینجا ورودی Doctor است چون رزرو عمومی را بیمار
 * انجام می‌دهد و کاربرِ درخواست هیچ محیط کاری ندارد. به همین دلیل هم null اینجا
 * معنای صریحِ «مطب شخصی» دارد، نه «نامشخص».
 */
class BookingContextResolver
{
    public function __construct(
        private readonly ClinicRepository $clinicRepo,
    ) {}

    public function resolve(Doctor $doctor, ?string $clinicUuid): ?Clinic
    {
        if ($clinicUuid === null || trim($clinicUuid) === '') {
            return null;
        }

        $clinic = $this->clinicRepo->findByUuid(trim($clinicUuid));
        if ($clinic === null || !$clinic->hasDoctor($doctor)) {
            throw new AppException(ErrorCodes::ERR_VALIDATION_002, 'محل نوبت‌دهی یافت نشد', 404);
        }

        return $clinic;
    }
}
