<?php

declare(strict_types=1);

namespace App\Module\Commercial\Domain\Entity;

use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use App\Module\Commercial\Infrastructure\Doctrine\DoctrineBankRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Attribute\Groups;

/**
 * Banque selectionnable pour le reglement par virement (Societe Generale,
 * CIC, Credit Agricole) : referentiel statique seede par la migration M1 et
 * re-seede en dev/test par CommercialReferentialFixtures.
 *
 * Lecture seule au M1 (HP-M2-2) : GetCollection + Get uniquement (ERP-56),
 * permission commercial.clients.view ; POST/PATCH/DELETE -> 405. Pas de
 * Timestampable/Blamable (referentiel statique whiteliste dans
 * EntitiesAreTimestampableBlamableTest::EXCLUDED). Le groupe
 * `client:read:accounting` permet l'embarquement dans la reponse Client ;
 * `supplier:read:accounting` dans la reponse Fournisseur (M2, ERP-92 — § 4.0) ;
 * `provider:read:accounting` dans la reponse Prestataire (M3, ERP-139 — § 4.0.bis).
 */
#[ApiResource(
    operations: [
        new GetCollection(
            security: "is_granted('commercial.clients.view') or is_granted('commercial.suppliers.view')",
            normalizationContext: ['groups' => ['bank:read']],
            // Tri par defaut spec M1 § 4.7 : position ASC puis label ASC.
            order: ['position' => 'ASC', 'label' => 'ASC'],
            // ERP-72 : pagination serveur + toggle ?pagination=false (cf. TvaMode).
            paginationClientEnabled: true,
        ),
        new Get(
            security: "is_granted('commercial.clients.view') or is_granted('commercial.suppliers.view')",
            normalizationContext: ['groups' => ['bank:read']],
        ),
    ],
    security: "is_granted('commercial.clients.view') or is_granted('commercial.suppliers.view')",
)]
#[ORM\Entity(repositoryClass: DoctrineBankRepository::class)]
#[ORM\Table(name: 'bank')]
#[ORM\UniqueConstraint(name: 'uq_bank_code', columns: ['code'])]
class Bank
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    #[Groups(['bank:read', 'client:read:accounting', 'supplier:read:accounting', 'provider:read:accounting'])]
    private ?int $id = null;

    #[ORM\Column(length: 30)]
    #[Groups(['bank:read', 'client:read:accounting', 'supplier:read:accounting', 'provider:read:accounting'])]
    private ?string $code = null;

    #[ORM\Column(length: 120)]
    #[Groups(['bank:read', 'client:read:accounting', 'supplier:read:accounting', 'provider:read:accounting'])]
    private ?string $label = null;

    #[ORM\Column(options: ['default' => 0])]
    #[Groups(['bank:read'])]
    private int $position = 0;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getCode(): ?string
    {
        return $this->code;
    }

    public function setCode(string $code): static
    {
        $this->code = $code;

        return $this;
    }

    public function getLabel(): ?string
    {
        return $this->label;
    }

    public function setLabel(string $label): static
    {
        $this->label = $label;

        return $this;
    }

    public function getPosition(): int
    {
        return $this->position;
    }

    public function setPosition(int $position): static
    {
        $this->position = $position;

        return $this;
    }
}
