<?php

namespace App\Tests\Policy;

use App\Clinic\Entity\Clinic;
use App\ClinicService\Entity\ServiceItem;
use App\ClinicService\Entity\ServiceSection;
use App\Doctor\Entity\DoctorAddress;
use App\Tests\ApiTestCase;
use PHPUnit\Framework\Attributes\Group;

/**
 * خروجی واقعیِ اندپوینت‌های قانون برای `docs/api/policy.md`.
 *
 * جدا از تست‌های رفتاری است و در گروه `docs` می‌ماند تا در اجرای عادی نویز نسازد.
 */
#[Group('docs')]
class DocsCaptureTest extends ApiTestCase
{
    public function testCapture(): void
    {
        // به‌صورت پیش‌فرض رد می‌شود: کارش تولید خروجی برای مستندات است، نه ادعای رفتار.
        if (getenv('POLICY_DOCS') !== '1') {
            self::markTestSkipped('برای تولید خروجی مستندات: POLICY_DOCS=1');
        }

        $user   = $this->createUser(['ROLE_USER', 'ROLE_CLINIC']);
        $clinic = new Clinic($user);
        $clinic->setName('کلینیک نمونه');
        $this->em->persist($clinic);
        $this->em->flush();

        $section = new ServiceSection('clinic', $clinic->getId(), 'زیبایی');
        $this->em->persist($section);

        $address = DoctorAddress::forClinic($clinic->getId());
        $address->setName('شعبهٔ مرکزی');
        $this->em->persist($address);
        $this->em->flush();

        $service = new ServiceItem($section, 'لیزر صورت');
        $service->setSoloDurationMinutes(20);
        $service->setPriceRials(1_000_000);
        $this->em->persist($service);
        $this->em->flush();

        $dump = function (string $label, mixed $body): void {
            fwrite(
                STDERR,
                sprintf("\n===%s %d===\n%s\n", $label, $this->responseCode(), json_encode($body, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)),
            );
        };

        $dump('SCHEMA', $this->authJson('GET', '/api/v1/policy-schema', $user));

        $created = $this->authJson('POST', '/api/v1/policy', $user, [
            'category'  => 'timing',
            'name'      => 'حداقل یک ساعت برای لیزر',
            'priority'  => 10,
            'condition' => ['match' => 'all', 'conditions' => [
                ['field' => 'item_count', 'operator' => 'greater_than', 'value' => 1],
            ]],
            'effects'   => [['type' => 'min_duration_minutes', 'value' => 60]],
        ]);
        $dump('CREATE', $created);

        $uuid = $created['data']['uuid'];

        $dump('ACTIVATE', $this->authJson('POST', "/api/v1/policy/$uuid/activate", $user));

        $dump('VERSION', $this->authJson('POST', "/api/v1/policy/$uuid/version", $user, [
            'effects' => [['type' => 'min_duration_minutes', 'value' => 90]],
        ]));

        $dump('SHOW', $this->authJson('GET', "/api/v1/policy/$uuid", $user));
        $dump('INDEX', $this->authJson('GET', '/api/v1/policies?category=timing', $user));

        $dump('BAD_FIELD', $this->authJson('POST', '/api/v1/policy', $user, [
            'category'  => 'timing',
            'name'      => 'قانون نامعتبر',
            'condition' => ['match' => 'all', 'conditions' => [
                ['field' => 'subtotal_rials', 'operator' => 'greater_than', 'value' => 10],
            ]],
            'effects'   => [['type' => 'min_duration_minutes', 'value' => 30]],
        ]));

        $dump('BAD_EFFECT', $this->authJson('POST', '/api/v1/policy', $user, [
            'category' => 'timing',
            'name'     => 'اثر نامعتبر',
            'effects'  => [['type' => 'discount_percent', 'value' => 10]],
        ]));

        $dump('DEACTIVATE', $this->authJson('POST', "/api/v1/policy/$uuid/deactivate", $user));

        self::assertTrue(true);
    }
}
