<?php

namespace App\Tests\Patient;

use App\Doctor\Entity\Doctor;
use App\Tag\Entity\TenantTag;
use App\Tests\ApiTestCase;

/**
 * POST/PATCH /patient accept `record_number` and tenant-scoped `tags` (uuids).
 */
class PatientRecordTagsApiTest extends ApiTestCase
{
    private function doctor(): array
    {
        $owner  = $this->createUser(['ROLE_DOCTOR']);
        $doctor = new Doctor($owner, 'دکتر');
        $this->em->persist($doctor);
        $this->em->flush();
        return [$owner, $doctor];
    }

    private function tag(int $doctorId, string $name): TenantTag
    {
        $t = new TenantTag('doctor', $doctorId, $name, '#FF0000');
        $this->em->persist($t);
        $this->em->flush();
        return $t;
    }

    public function testCreateAndUpdateWithRecordNumberAndTags(): void
    {
        [$owner, $doctor] = $this->doctor();
        $t1 = $this->tag($doctor->getId(), 'فوری');
        $t2 = $this->tag($doctor->getId(), 'پیگیری');

        $mobile = '09' . str_pad((string) random_int(0, 999_999_999), 9, '0', STR_PAD_LEFT);
        $created = $this->authJson('POST', '/api/v1/patient', $owner, [
            'mobile'        => $mobile,
            'name'          => 'بیمار نمونه',
            'record_number' => 'P-1001',
            'tags'          => [$t1->getUuid(), $t2->getUuid()],
        ]);
        self::assertSame(201, $this->responseCode());
        self::assertSame('P-1001', $created['data']['record_number']);
        self::assertCount(2, $created['data']['tags']);
        $uuid = $created['data']['uuid'];

        // update: keep one tag, change record number
        $updated = $this->authJson('PATCH', '/api/v1/patient/' . $uuid, $owner, [
            'record_number' => 'P-2002',
            'tags'          => [$t1->getUuid()],
        ]);
        self::assertSame(200, $this->responseCode());
        self::assertSame('P-2002', $updated['data']['record_number']);
        self::assertCount(1, $updated['data']['tags']);
    }

    public function testRejectsForeignTag(): void
    {
        [$owner, $doctor] = $this->doctor();
        $mobile  = '09' . str_pad((string) random_int(0, 999_999_999), 9, '0', STR_PAD_LEFT);
        $created = $this->authJson('POST', '/api/v1/patient', $owner, ['mobile' => $mobile, 'name' => 'ب']);
        $uuid    = $created['data']['uuid'];

        [, $doctorB] = $this->doctor();
        $foreign     = $this->tag($doctorB->getId(), 'خارجی');

        $this->authJson('PATCH', '/api/v1/patient/' . $uuid, $owner, ['tags' => [$foreign->getUuid()]]);
        self::assertSame(422, $this->responseCode());
    }
}
