/**
 * Types front du module Catalog (M0 — Gestion des categories).
 *
 * Contrats API consommes :
 *   - GET /api/categories          → HydraCollection<Category>
 *   - GET /api/categories/{id}     → Category
 *   - POST /api/categories         → body { name, categoryTypes: IRI[] }
 *   - PATCH /api/categories/{id}   → body partiel { name?, categoryTypes?: IRI[] }
 *   - DELETE /api/categories/{id}  → 204 (soft delete via CategoryProcessor)
 *   - GET /api/category_types      → HydraCollection<CategoryType>
 *
 * Notes :
 *   - Les IRI sont envoyes en POST/PATCH (ex. ["/api/category_types/3"]).
 *   - `categoryTypes` est embarque (groupe Serializer `category:read` sur les
 *     proprietes de CategoryType) : tableau d'objets type en lecture.
 *   - `createdBy` / `updatedBy` peuvent etre `null` (hors contexte HTTP,
 *     ON DELETE SET NULL en BDD). Affichage : libelle "Systeme" si null.
 */

/**
 * Reference legere d'un user, telle qu'embarquee dans Category.createdBy /
 * updatedBy. Volontairement minimaliste : on n'a besoin que de l'identifiant
 * et de l'username pour l'affichage courant.
 */
export interface User {
    id: number
    username: string
}

/**
 * Reference du referentiel CategoryType (lecture seule au M0).
 */
export interface CategoryType {
    id: number
    code: string
    label: string
}

/**
 * Categorie metier — telle qu'elle est lue depuis l'API. L'entite porte le
 * pattern Timestampable+Blamable (cf. spec-back § 2.8).
 */
export interface Category {
    id: number
    name: string
    /** Types de la categorie (>= 1, ManyToMany embarque en lecture). */
    categoryTypes: CategoryType[]
    /** Soft delete : null = active, valeur = supprimee logiquement le {date}. */
    deletedAt: string | null
    createdAt: string
    updatedAt: string
    createdBy: User | null
    updatedBy: User | null
}

/**
 * Payload accepte en POST /api/categories. `categoryTypes` est un tableau
 * d'IRI Hydra (ex. `['/api/category_types/3', '/api/category_types/5']`).
 */
export interface CategoryCreateInput {
    name: string
    categoryTypes: string[]
}

/**
 * Payload accepte en PATCH /api/categories/{id}. Tous les champs sont
 * optionnels (modification partielle).
 */
export interface CategoryUpdateInput {
    name?: string
    categoryTypes?: string[]
}
