<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.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>
