<?php

declare(strict_types=1);

namespace App\Module\Catalog\Domain\Entity;

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

/**
 * Type de categorie : referentiel statique classifiant les Category
 * (ex: MATIERE, PRODUIT, SERVICE). Cree vide par la migration M0 ; son seed
 * initial et son CRUD admin sont hors perimetre M0 (cf. spec-back § 9 HP-1).
 *
 * Lecture seule au M0 : seules les operations GetCollection et Get sont
 * exposees, sous la meme permission que Category (catalog.categories.view).
 *
 * Referentiel statique : pas de Timestampable/Blamable (whiteliste dans
 * EntitiesAreTimestampableBlamableTest::EXCLUDED). Le groupe `category:read`
 * est ajoute sur chaque propriete pour que le type soit embarque dans la
 * reponse d'une Category (cf. .claude/rules/backend.md § Serialization).
 */
#[ApiResource(
    operations: [
        new GetCollection(
            security: "is_granted('catalog.categories.view')",
            normalizationContext: ['groups' => ['category_type:read']],
            // Tri par defaut requis par la spec M0 § 4.6 : ordre alphabetique
            // stable pour alimenter le <MalioSelect> du formulaire Category.
            order: ['label' => 'ASC'],
        ),
        new Get(
            security: "is_granted('catalog.categories.view')",
            normalizationContext: ['groups' => ['category_type:read']],
        ),
    ],
)]
#[ORM\Entity(repositoryClass: DoctrineCategoryTypeRepository::class)]
#[ORM\Table(name: 'category_type')]
// Contrainte d'unicite nommee pour matcher la migration (cf. Role/Permission).
#[ORM\UniqueConstraint(name: 'uq_category_type_code', columns: ['code'])]
class CategoryType
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    #[Groups(['category_type:read', 'category:read'])]
    private ?int $id = null;

    #[ORM\Column(length: 40)]
    #[Groups(['category_type:read', 'category:read'])]
    private ?string $code = null;

    #[ORM\Column(length: 120)]
    #[Groups(['category_type:read', 'category:read'])]
    private ?string $label = null;

    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;
    }
}
