<template>
    <main class="container mx-auto max-w-4xl px-6 py-10 space-y-8">
        <header class="space-y-2">
            <h1 class="text-3xl font-bold text-base-content">Changelog</h1>
            <p class="text-sm text-base-content/70">
                Historique des modifications et nouvelles fonctionnalités de
                l'application.
            </p>
        </header>

        <section
            v-for="release in releases"
            :key="release.version"
            class="card border border-base-200 bg-base-100 shadow-sm"
        >
            <div class="card-body space-y-3">
                <div class="flex items-center gap-3">
                    <h2 class="text-xl font-bold text-base-content">
                        {{ release.version }}
                    </h2>
                    <span class="badge badge-ghost text-xs">{{
                        release.date
                    }}</span>
                </div>

                <ul class="space-y-2">
                    <li
                        v-for="(item, i) in release.changes"
                        :key="i"
                        class="flex items-start gap-2 text-sm text-base-content/80"
                    >
                        <span
                            class="badge badge-sm mt-0.5 shrink-0"
                            :class="badgeClass(item.type)"
                        >
                            {{ item.type }}
                        </span>
                        <span>{{ item.text }}</span>
                    </li>
                </ul>
            </div>
        </section>
    </main>
</template>

<script setup lang="ts">
import { useHead } from "#imports";

useHead({ title: "Changelog" });

type ChangeType = "feat" | "fix" | "perf" | "chore";

interface Change {
    type: ChangeType;
    text: string;
}

interface Release {
    version: string;
    date: string;
    changes: Change[];
}

const badgeClass = (type: ChangeType) => {
    const map: Record<ChangeType, string> = {
        feat: "badge-primary",
        fix: "badge-error",
        perf: "badge-warning",
        chore: "badge-ghost",
    };
    return map[type] ?? "badge-ghost";
};

const releases: Release[] = [
    {
        version: "v1.9.5",
        date: "2026-03-31",
        changes: [
            {
                type: "feat",
                text: "Référence automatique des pièces et composants : génération d'une référence technique à partir d'une formule configurable sur la catégorie, recalculée automatiquement à chaque modification des champs personnalisés",
            },
            {
                type: "feat",
                text: "Formula builder interactif : sélection des champs disponibles par clic (chips) avec insertion à la position du curseur, aperçu live avec valeurs d'exemple, et calcul automatique des champs requis",
            },
            {
                type: "feat",
                text: "Versioning des entités : numéro de version incrémenté automatiquement à chaque modification, avec historique des versions et possibilité de restaurer une version antérieure",
            },
            {
                type: "feat",
                text: "Bouton de sauvegarde unique sur la fiche machine : remplacement des sauvegardes automatiques par un bouton explicite, avec affichage des versions sur les liens composants/pièces/produits",
            },
        ],
    },
    {
        version: "v1.9.4",
        date: "2026-03-25",
        changes: [
            {
                type: "feat",
                text: "Pages de consultation détaillées pour les pièces, composants et produits : vue lecture seule avec affichage propre des informations, fournisseurs, champs personnalisés et documents",
            },
            {
                type: "feat",
                text: "Bouton bascule Modifier / Voir détails sur les fiches pièces, composants et produits, identique au fonctionnement de la fiche machine",
            },
            {
                type: "feat",
                text: "Bouton « Détails » sur les catalogues pièces, composants et produits pour accéder directement à la vue consultation",
            },
            {
                type: "feat",
                text: "Masquage automatique des champs vides et de la section documents en mode consultation",
            },
            {
                type: "feat",
                text: "Accès direct au mode édition via le paramètre ?edit=true dans l'URL",
            },
        ],
    },
    {
        version: "v1.9.2",
        date: "2026-03-23",
        changes: [
            {
                type: "feat",
                text: "Serveur MCP (Model Context Protocol) : l'application expose désormais un serveur MCP permettant l'intégration avec des assistants IA — outils CRUD complets pour toutes les entités, recherche inventaire, historique, commentaires, champs personnalisés, documents, slots et structure machine",
            },
            {
                type: "feat",
                text: "Types de documents : classification des documents par type (Plan, Photo, Fiche technique, Notice, Certificat, Facture, Bon de commande, Autre) avec filtre dédié sur la page documents, sélection du type à l'upload et possibilité de modifier le type après upload",
            },
            {
                type: "feat",
                text: "Filtre sites multi-sélection sur le Parc Machines : remplacement du menu déroulant par des cases à cocher permettant de filtrer sur un ou plusieurs sites simultanément",
            },
            {
                type: "feat",
                text: "Tri alphabétique automatique des machines sur le Parc Machines",
            },
            {
                type: "feat",
                text: "Recherche par nom OU référence sur les catalogues : la recherche dans les catalogues pièces, composants et produits cherche désormais dans le nom et la référence simultanément (extension Doctrine OR search)",
            },
            {
                type: "feat",
                text: "Quantité sur les slots pièces : ajout d'un champ quantité éditable directement depuis la page d'édition d'un composant",
            },
            {
                type: "feat",
                text: "Lien rapide vers la catégorie depuis la page d'édition d'un composant",
            },
            {
                type: "feat",
                text: "Redirection vers la page d'édition après création d'un composant, d'une pièce ou d'un produit",
            },
            {
                type: "fix",
                text: "Correction de la suppression de fournisseurs sur les pièces, composants et produits : la suppression est maintenant persistée correctement",
            },
            {
                type: "fix",
                text: "Correction de la création de composants : les sélections de pièces, produits et sous-composants sont maintenant sauvegardées, et les slots squelette sont correctement initialisés",
            },
            {
                type: "fix",
                text: "Correction de la perte de données lors de la sauvegarde d'une catégorie (champs personnalisés et structure)",
            },
            {
                type: "fix",
                text: "Correction de la suppression de composants depuis la fiche machine (utilisation du linkId au lieu du composantId)",
            },
            {
                type: "fix",
                text: "Amélioration de l'envoi des fournisseurs en PATCH : le tableau est toujours envoyé pour éviter les pertes",
            },
            {
                type: "fix",
                text: "Filtrage serveur des options dans les sélecteurs de slots au lieu du filtrage client",
            },
            {
                type: "fix",
                text: "Page d'édition pièce : rester sur la page après sauvegarde au lieu de rediriger",
            },
            {
                type: "fix",
                text: "Messages d'erreur 409 (conflit) : extraction du champ d'erreur pour un message compréhensible",
            },
            {
                type: "perf",
                text: "Suppression des chargements catalogue redondants sur la page d'édition composant",
            },
        ],
    },
    {
        version: "v1.9.1",
        date: "2026-03-16",
        changes: [
            {
                type: "feat",
                text: "Normalisation JSON → tables relationnelles : les structures des composants (pièces, produits, sous-composants) et les squelettes des catégories sont désormais stockés dans des tables dédiées au lieu de colonnes JSON, améliorant la fiabilité et les performances des requêtes",
            },
            {
                type: "feat",
                text: "Synchronisation des catégories (ModelType Sync) : la modification d'une catégorie (ajout/suppression de slots ou champs personnalisés) peut être propagée automatiquement à tous les éléments existants de cette catégorie, avec prévisualisation des changements avant application",
            },
            {
                type: "feat",
                text: "Sélection interactive des items dans les slots : sur la page d'édition d'un composant, il est maintenant possible de choisir directement la pièce, le produit ou le sous-composant assigné à chaque emplacement du squelette via des sélecteurs avec recherche",
            },
            {
                type: "feat",
                text: "Endpoints PATCH pour les slots composant : modification de la quantité et de l'item sélectionné sur les slots pièce, produit et sous-composant",
            },
            {
                type: "feat",
                text: "Table de relation pièce ↔ produit (PieceProductSlot) avec versioning pour le suivi des modifications de structure",
            },
            {
                type: "feat",
                text: "Gestion des champs personnalisés sur les catégories : synchronisation automatique des définitions de champs (ajout, modification, suppression) lors de la sauvegarde d'une catégorie",
            },
            {
                type: "feat",
                text: "Suite de tests étendue : 219 tests couvrant les stratégies de synchronisation, le contrôleur de sync et les nouvelles entités",
            },
            {
                type: "fix",
                text: "Correction de l'affichage des sélections pré-existantes dans les slots : les pièces, produits et sous-composants déjà assignés sont maintenant correctement affichés à l'ouverture de la page d'édition (correction du cache catalogue)",
            },
            {
                type: "fix",
                text: "Fallback position/orderIndex sur index de tableau dans les stratégies de sync pour éviter les erreurs quand le champ est absent",
            },
        ],
    },
    {
        version: "v1.9.0",
        date: "2026-03-09",
        changes: [
            {
                type: "feat",
                text: "Gestion des champs personnalisés sur les machines : ajout, modification et suppression de définitions de champs directement depuis la fiche machine",
            },
            {
                type: "feat",
                text: "Refonte UI globale : amélioration du styling, des layouts et du responsive sur l'ensemble des composants et pages",
            },
            {
                type: "feat",
                text: "Suite de tests API complète : 167 tests couvrant toutes les entités, la sécurité et les validations",
            },
            {
                type: "feat",
                text: "Endpoint /api/health pour le monitoring applicatif",
            },
            {
                type: "fix",
                text: "Sécurité renforcée : désactivation de la migration de session sur le firewall API, durcissement des accès documents et sessions",
            },
            {
                type: "fix",
                text: "Confirmation de suppression avec impact sur le catalogue produits (documents, liaisons machines en cascade)",
            },
            {
                type: "fix",
                text: "Correction du débordement des dropdowns dans les DataTable",
            },
            {
                type: "perf",
                text: "Refactoring massif du frontend : extraction de 15+ composables et composants partagés, réduction de la taille des fichiers",
            },
            {
                type: "chore",
                text: "Extraction de CuidEntityTrait et abstraction du subscriber d'audit côté backend",
            },
            {
                type: "chore",
                text: "Ajout de DAMA DoctrineTestBundle pour l'isolation des tests par transaction",
            },
        ],
    },
    {
        version: "v1.8.1",
        date: "2026-03-05",
        changes: [
            {
                type: "feat",
                text: "Composant DataTable générique avec tri, recherche, pagination et filtres server-side — toutes les pages catalogue migrées vers ce composant partagé",
            },
            {
                type: "feat",
                text: "Messages d'erreur humanisés : les erreurs backend sont traduites en messages compréhensibles pour l'utilisateur final",
            },
            {
                type: "feat",
                text: "Modal d'ajout d'entités aux machines : ajout direct de composants, pièces et produits depuis la fiche machine",
            },
            {
                type: "feat",
                text: "Filtres SearchFilter ipartial sur les noms de types de modèles et commentaires côté API",
            },
            {
                type: "feat",
                text: "Suppression du système TypeMachine (squelettes machines) : les champs personnalisés sont désormais liés directement à chaque machine",
            },
            {
                type: "feat",
                text: "Simplification de la création de machines : plus besoin de sélectionner un squelette, ajout direct des entités",
            },
            {
                type: "fix",
                text: "Suppression catalogue pièces/composants : confirmation avec liste des éléments supprimés en cascade (documents, liaisons machine, champs personnalisés) au lieu de bloquer la suppression",
            },
            {
                type: "fix",
                text: "Affichage des catégories sur les pages d'édition (produit, composant, pièce) : correction de « Catégorie inconnue » causée par un import obsolète dans ModelType",
            },
            {
                type: "fix",
                text: "Recherche insensible à la casse sur les commentaires et documents (partial → ipartial)",
            },
            {
                type: "chore",
                text: "Suppression des pages squelettes machines (/machine-skeleton, /type) et composants associés",
            },
        ],
    },
    {
        version: "v1.8.0",
        date: "2026-03-03",
        changes: [
            {
                type: "feat",
                text: "Stockage des documents sur le système de fichiers au lieu de Base64 en base de données, avec endpoints dédiés pour servir et télécharger les fichiers",
            },
            {
                type: "feat",
                text: "Pagination serveur sur la page Documents avec recherche, tri (date/nom/taille), filtre par rattachement et sélecteur d'éléments par page",
            },
            {
                type: "feat",
                text: "Compression PDF automatique à l'upload via Ghostscript, avec commande pour compresser les PDFs existants",
            },
            {
                type: "feat",
                text: "Champ description sur les pièces et composants, visible dans les catalogues avec popover au survol",
            },
            {
                type: "feat",
                text: "Commande de migration app:migrate-documents-to-filesystem pour migrer les documents existants (Base64 → fichiers)",
            },
            {
                type: "fix",
                text: "Normalisation des documents : fileUrl et downloadUrl toujours exposés dans l'API",
            },
            {
                type: "fix",
                text: "Édition de squelettes machines : correction du conflit UniqueEntity et de l'interférence du désérialiseur",
            },
            {
                type: "fix",
                text: "Sites : ajout de l'opération PATCH et correction de la migration de contrainte",
            },
            {
                type: "chore",
                text: "Réorganisation de la navbar avec nouvelles icônes Lucide",
            },
        ],
    },
    {
        version: "v1.7.0",
        date: "2026-03-02",
        changes: [
            {
                type: "feat",
                text: "Système de commentaires / tickets : possibilité de laisser des commentaires sur les fiches (machines, pièces, composants, produits, catégories, squelettes) avec résolution par les gestionnaires",
            },
            {
                type: "feat",
                text: "Page commentaires centralisée (/comments) avec filtres par statut, type d'entité, pagination et liens cliquables vers les fiches",
            },
            {
                type: "feat",
                text: "Badge notifications : compteur de commentaires ouverts sur l'avatar utilisateur et dans le menu profil (polling 60s)",
            },
            {
                type: "feat",
                text: "Contrôle d'accès par rôles : ROLE_ADMIN, ROLE_GESTIONNAIRE, ROLE_VIEWER avec permissions granulaires sur toutes les pages",
            },
            {
                type: "feat",
                text: "Journal d'audit étendu : suivi des opérations sur machines, fournisseurs, types de modèles, documents et conversions",
            },
            {
                type: "feat",
                text: "Commande app:init-profile-passwords pour l'initialisation en masse des mots de passe et rôles",
            },
            {
                type: "fix",
                text: "Toggle switch pour les champs personnalisés booléens (remplace les checkboxes)",
            },
            {
                type: "fix",
                text: "Recherche fournisseur : filtrage côté client au lieu d'appels API debounce",
            },
            {
                type: "fix",
                text: "Prévention des doublons de noms de fournisseurs et de références de pièces (contraintes unique)",
            },
            {
                type: "fix",
                text: "Correction de la création de squelettes machines : pagination, duplication, champs personnalisés",
            },
        ],
    },
    {
        version: "v1.6.1",
        date: "2026-02-12",
        changes: [
            {
                type: "feat",
                text: "Suivi d'audit étendu : enregistrement des opérations CRUD sur les machines, fournisseurs, catégories (ModelType) et documents",
            },
            {
                type: "feat",
                text: "Traçabilité des conversions de catégories dans le journal d'activité (action « convert » avec direction, nombre et noms des éléments)",
            },
            {
                type: "feat",
                text: "Endpoint historique machine : GET /api/machines/{id}/history",
            },
        ],
    },
    {
        version: "v1.6.0",
        date: "2026-02-12",
        changes: [
            {
                type: "feat",
                text: "Conversion bidirectionnelle des catégories : possibilité de convertir une catégorie de pièce en catégorie de composant (et inversement) avec transfert automatique de tous les éléments, documents, champs personnalisés et fournisseurs",
            },
            {
                type: "feat",
                text: "Vérification des conditions de blocage avant conversion : liaisons machines, templates de type machine, sous-composants dans la structure, collisions de noms",
            },
            {
                type: "feat",
                text: "Bouton « Convertir » sur les listes de catégories pièce et composant avec modale de confirmation détaillée",
            },
            {
                type: "chore",
                text: "Passage php-cs-fixer sur l'ensemble des contrôleurs et entités du backend",
            },
        ],
    },
    {
        version: "v1.5.0",
        date: "2026-02-11",
        changes: [
            {
                type: "feat",
                text: "Page de journal d'activité globale avec filtres par entité, par acteur et pagination serveur",
            },
            {
                type: "feat",
                text: "Suivi d'audit : enregistrement des noms de fournisseurs et des modifications de champs personnalisés",
            },
            {
                type: "feat",
                text: "Préservation de l'état des listes dans l'URL (page courante, recherche, tri, direction, filtres) — le retour navigateur restaure exactement la position précédente",
            },
            {
                type: "feat",
                text: "Boutons « Retour » sur toutes les pages de création et d'édition utilisent désormais l'historique du navigateur au lieu de liens fixes",
            },
            {
                type: "feat",
                text: "Première lettre automatiquement en majuscule lors de la création de catégories et de composants",
            },
            {
                type: "feat",
                text: "Les types de catégories dans les tableaux des catalogues sont maintenant cliquables (lien vers la fiche d'édition)",
            },
            {
                type: "feat",
                text: "Application des couleurs de marque Malio sur l'ensemble du thème (navbar, boutons, badges)",
            },
            {
                type: "feat",
                text: "Page changelog accessible depuis le footer",
            },
            {
                type: "fix",
                text: "Correction des filtres de tri et de recherche cassés sur les catalogues composants, pièces et produits",
            },
            {
                type: "fix",
                text: "Correction du filtre par rattachement (site, machine, composant, pièce) sur la page documents",
            },
            {
                type: "fix",
                text: "Correction de l'affichage des champs personnalisés sur les pages d'édition (condition de concurrence)",
            },
            {
                type: "fix",
                text: "Plafonnement de la pagination à 200 éléments par page pour éviter les erreurs mémoire en production",
            },
            {
                type: "perf",
                text: "Cache intelligent sur les composables usePieces et useComposants : les données déjà chargées ne sont plus re-téléchargées inutilement",
            },
            {
                type: "perf",
                text: "Réduction des appels API bloquants sur les pages d'édition",
            },
        ],
    },
    {
        version: "v1.4.0",
        date: "2026-02-04",
        changes: [
            {
                type: "perf",
                text: "Optimisation de la sérialisation API : ajout de groupes dédiés pour CustomFieldValue et CustomField, réduisant significativement la taille des réponses",
            },
            {
                type: "perf",
                text: "Pages d'édition machines/composants/pièces : chargement parallèle des données au lieu de séquentiel",
            },
        ],
    },
    {
        version: "v1.3.0",
        date: "2026-01-28",
        changes: [
            {
                type: "feat",
                text: "Refactoring complet du frontend : découpage des méga-composants en modules réutilisables (7 chantiers F1-F7)",
            },
            {
                type: "feat",
                text: "Page détail machine découpée de 2989 à 219 lignes avec 2 composables et 7 sous-composants",
            },
            {
                type: "feat",
                text: "Page création machine découpée de 1231 à 196 lignes avec 1 composable et 5 sous-composants",
            },
            {
                type: "feat",
                text: "Extraction de 4 modules utilitaires partagés (champs personnalisés, affichage produits, documents, fournisseurs)",
            },
            {
                type: "feat",
                text: "Fusion des composables dupliqués : 3 composables d'historique et 3 composables de types fusionnés en versions génériques",
            },
            {
                type: "feat",
                text: "Remplacement de confirm() natif par une modale DaisyUI personnalisée sur l'ensemble de l'application",
            },
            {
                type: "feat",
                text: "Extraction de la navbar dans un composant AppNavbar dédié",
            },
            {
                type: "feat",
                text: "Suite de 54 tests unitaires avec Vitest couvrant les utilitaires et composables",
            },
            {
                type: "perf",
                text: "Optimisations API : helper extractCollection partagé, invalidation de cache ciblée",
            },
            {
                type: "chore",
                text: "Migration des composables JavaScript vers TypeScript strict",
            },
            {
                type: "chore",
                text: "Activation de règles ESLint strictes et suppression de 19 console.log de débogage",
            },
        ],
    },
    {
        version: "v1.2.0",
        date: "2026-01-21",
        changes: [
            {
                type: "feat",
                text: "Système de suivi d'historique (audit) avec enregistrement automatique des modifications sur toutes les entités",
            },
            {
                type: "feat",
                text: "Interface dédiée à l'historique sur les fiches produits, pièces et composants",
            },
            {
                type: "feat",
                text: "Modale d'éléments liés sur les pages de gestion des catégories avec navigation directe vers la fiche d'édition",
            },
            {
                type: "feat",
                text: "Possibilité d'ajouter des champs personnalisés en mode restreint sur les catégories",
            },
        ],
    },
    {
        version: "v1.1.1",
        date: "2026-01-14",
        changes: [
            {
                type: "feat",
                text: "Compression automatique des fichiers PDF à l'upload via qpdf, réduisant l'espace de stockage",
            },
            {
                type: "chore",
                text: "Ajout de qpdf dans l'image Docker pour le support de la compression PDF",
            },
        ],
    },
    {
        version: "v1.1.0",
        date: "2026-01-07",
        changes: [
            {
                type: "fix",
                text: "Recherche insensible à la casse sur l'ensemble des filtres de toutes les entités (machines, composants, pièces, produits)",
            },
            {
                type: "chore",
                text: "Réinitialisation des migrations vers un schéma initial unique avec guide de déploiement",
            },
            {
                type: "chore",
                text: "Mise à jour des fixtures avec les données courantes de la base",
            },
        ],
    },
    {
        version: "v1.0.0",
        date: "2025-12-15",
        changes: [
            {
                type: "feat",
                text: "Gestion complète des machines : création, édition, vue détaillée avec liaisons composants et pièces",
            },
            {
                type: "feat",
                text: "Catalogues composants, pièces et produits avec recherche serveur, tri et pagination",
            },
            {
                type: "feat",
                text: "Système de catégories (types) avec squelettes de champs personnalisés et drag & drop pour réordonner",
            },
            {
                type: "feat",
                text: "Upload de documents avec prévisualisation PDF et images, miniatures dans les tableaux",
            },
            {
                type: "feat",
                text: "Gestion des fournisseurs multiples avec résolution automatique des noms",
            },
            {
                type: "feat",
                text: "Exigences produit sur les pièces : support de liaisons multiples",
            },
            {
                type: "feat",
                text: "Sélections de composants sur les pièces avec recherche dynamique",
            },
            {
                type: "feat",
                text: "Système de sessions utilisateurs avec authentification par cookie",
            },
            {
                type: "feat",
                text: "Mémorisation des préférences de tri par catalogue (cookies)",
            },
            {
                type: "feat",
                text: "Formatage automatique des contacts et des montants en format français",
            },
            {
                type: "feat",
                text: "Protection contre les suppressions : affichage des dépendances bloquantes avant confirmation",
            },
            {
                type: "chore",
                text: "Infrastructure Docker complète avec PostgreSQL, PHP 8.4, API Platform et pgAdmin",
            },
        ],
    },
];
</script>
