<?php

namespace App\Tests\Auth;

use App\Auth\Entity\PreRegistration;
use App\Tests\ApiTestCase;

/**
 * نام ثبت‌شده در پیش‌ثبت‌نام هرگز نباید عنوان «دکتر» را در خود نگه دارد — وگرنه پس از
 * تأیید، پزشک/کلینیک/realName ساخته‌شده «دکتر دکتر …» نمایش داده می‌شوند. عنوان فقط در
 * لایهٔ نمایش افزوده می‌شود (displayDoctorName سمت فرانت).
 */
class PreRegistrationNameTitleTest extends ApiTestCase
{
    private function freshMobile(): string
    {
        return '09' . str_pad((string) random_int(0, 999_999_999), 9, '0', STR_PAD_LEFT);
    }

    private function submit(string $name, string $mobile): array
    {
        $this->client->request(
            'POST',
            '/api/v1/pre-registration',
            server: ['CONTENT_TYPE' => 'application/json'],
            content: json_encode(['type' => 'independent_doctor', 'name' => $name, 'mobile' => $mobile]),
        );

        return json_decode($this->client->getResponse()->getContent(), true) ?? [];
    }

    private function storedName(string $mobile): ?string
    {
        $this->em->clear();
        $preReg = $this->em->getRepository(PreRegistration::class)->findOneBy(['mobile' => $mobile]);

        return $preReg?->getName();
    }

    public function testTitleIsStrippedOnSubmit(): void
    {
        $mobile = $this->freshMobile();
        $this->submit('دکتر حامد حسینی', $mobile);

        self::assertSame(201, $this->responseCode());
        self::assertSame('حامد حسینی', $this->storedName($mobile));
    }

    public function testPlainNameIsLeftAlone(): void
    {
        $mobile = $this->freshMobile();
        $this->submit('حامد حسینی', $mobile);

        self::assertSame(201, $this->responseCode());
        self::assertSame('حامد حسینی', $this->storedName($mobile));
    }

    public function testRepeatedTitlePrefixIsCollapsed(): void
    {
        $mobile = $this->freshMobile();
        $this->submit('دکتر دکتر حامد حسینی', $mobile);

        self::assertSame(201, $this->responseCode());
        self::assertSame('حامد حسینی', $this->storedName($mobile));
    }
}
