<?php

declare(strict_types=1);

namespace App\Tests\Module\Commercial\Api;

/**
 * Tests fonctionnels des RG comptables inter-champs portees par les Assert\Callback
 * de l'entite Supplier (M2, RG-2.07 / RG-2.08), via le PATCH de l'onglet
 * Comptabilite (groupe supplier:write:accounting). On asserte le code HTTP et le
 * propertyPath de la violation (consommable par extractApiViolations cote front,
 * ERP-101). Complete les tests unitaires SupplierValidationTest par la preuve HTTP.
 *
 * @internal
 */
final class SupplierAccountingApiTest extends AbstractSupplierApiTestCase
{
    // === RG-2.07 : Virement impose une banque ===

    public function testVirementWithoutBankReturns422OnBankPath(): void
    {
        $client = $this->createAdminClient();
        $seed   = $this->seedSupplier('Virement No Bank');

        $response = $client->request('PATCH', '/api/suppliers/'.$seed->getId(), [
            'headers' => ['Content-Type' => self::MERGE, 'Accept' => self::LD],
            'json'    => ['paymentType' => '/api/payment_types/'.$this->paymentType('VIREMENT')->getId()],
        ]);

        self::assertResponseStatusCodeSame(422);
        self::assertArrayHasKey('bank', $this->violationsByPath($response->toArray(false)));
    }

    public function testVirementWithBankReturns200(): void
    {
        $client = $this->createAdminClient();
        $seed   = $this->seedSupplier('Virement With Bank');

        $client->request('PATCH', '/api/suppliers/'.$seed->getId(), [
            'headers' => ['Content-Type' => self::MERGE],
            'json'    => [
                'paymentType' => '/api/payment_types/'.$this->paymentType('VIREMENT')->getId(),
                'bank'        => '/api/banks/'.$this->bank('SG')->getId(),
            ],
        ]);

        self::assertResponseStatusCodeSame(200);
    }

    // === RG-2.08 : LCR impose au moins un RIB ===

    public function testLcrWithoutRibReturns422OnRibsPath(): void
    {
        $client = $this->createAdminClient();
        $seed   = $this->seedSupplier('Lcr No Rib');

        $response = $client->request('PATCH', '/api/suppliers/'.$seed->getId(), [
            'headers' => ['Content-Type' => self::MERGE, 'Accept' => self::LD],
            'json'    => ['paymentType' => '/api/payment_types/'.$this->paymentType('LCR')->getId()],
        ]);

        self::assertResponseStatusCodeSame(422);
        self::assertArrayHasKey('ribs', $this->violationsByPath($response->toArray(false)));
    }

    public function testLcrWithRibReturns200(): void
    {
        $client = $this->createAdminClient();
        $seed   = $this->seedSupplier('Lcr With Rib');
        $this->addRib($seed);

        $client->request('PATCH', '/api/suppliers/'.$seed->getId(), [
            'headers' => ['Content-Type' => self::MERGE],
            'json'    => ['paymentType' => '/api/payment_types/'.$this->paymentType('LCR')->getId()],
        ]);

        self::assertResponseStatusCodeSame(200);
    }

    // violationsByPath() : helper mutualise dans AbstractSupplierApiTestCase.
}
