# =============================================================================
# .gitignore — Digital Workspace
# Stack : Laravel 11 × 13 services + React 18 × 12 modules frontend
#         PostgreSQL 16 + Redis 7 + Meilisearch + MinIO
#
# WHY ce fichier est à la racine du monorepo et non dans chaque service :
#   Un .gitignore racine couvre récursivement tous les sous-répertoires.
#   Quelques règles spécifiques à un service peuvent être ajoutées dans
#   services/{service}/.gitignore sans conflits.
#   Un seul fichier = une seule source de vérité à maintenir.
# =============================================================================


# =============================================================================
# SECRETS & CONFIGURATION LOCALE — JAMAIS VERSIONNÉS
# =============================================================================

# Fichiers .env — contiennent les vraies valeurs (DB_PASSWORD, JWT_SECRET, etc.)
# .env.example est versionné — .env ne l'est JAMAIS
.env
.env.local
.env.*.local
.env.production
.env.staging
.env.test

# WHY on exclut aussi les .env dans les sous-répertoires :
#   Chaque service Laravel a son propre .env (services/auth-service/.env)
#   et le frontend peut avoir le sien.
**/.env
**/.env.local

# Clés SSH et certificats locaux
*.pem
*.key
*.crt
*.p12
*.pfx
id_rsa
id_ed25519

# Fichiers de secrets générés localement
.secrets
secrets/


# =============================================================================
# DÉPENDANCES — JAMAIS VERSIONNÉES
# =============================================================================

# PHP — Composer
# WHY vendor/ exclu à tous les niveaux :
#   Les 13 services ont chacun leur vendor/ (Composer install --no-dev en prod).
#   Versionner vendor/ alourdirait le repo de ~500 Mo minimum.
**/vendor/
composer.phar

# Node.js — npm/yarn
# WHY node_modules/ à tous les niveaux :
#   12 modules frontend + npm workspaces → plusieurs node_modules imbriqués.
**/node_modules/
.npm
.yarn
yarn-error.log
package-lock.json
# WHY on garde yarn.lock s'il existe (cohérence des versions lockées)
# yarn.lock → à NE PAS exclure si utilisé

# Caches Composer et npm
.composer-cache/
.npm-cache/
.npm/


# =============================================================================
# BUILD & COMPILATION FRONTEND
# =============================================================================

# Vite — build output
**/dist/
**/build/

# WHY on exclut aussi les .vite et stats de bundle :
#   Ces fichiers changent à chaque build et ne sont pas utiles en review.
**/.vite/
**/stats.html
**/bundle-stats.json

# TypeScript — fichiers compilés
**/*.js.map
**/*.d.ts.map
# WHY on ne met PAS *.d.ts ici : les types locaux sont versionnés
# On exclut uniquement les .d.ts générés par le build
**/dist/**/*.d.ts

# Storybook (si ajouté plus tard)
storybook-static/


# =============================================================================
# LARAVEL — FICHIERS GÉNÉRÉS
# =============================================================================

# Cache Laravel (tous les services)
**/bootstrap/cache/*.php
!**/bootstrap/cache/.gitkeep

# Stockage Laravel
# WHY on versionne la structure mais pas les fichiers :
#   Les répertoires de stockage doivent exister (git ne versionne pas les dossiers vides).
#   On exclut les fichiers générés mais on garde les .gitkeep.
**/storage/app/public/*
!**/storage/app/public/.gitkeep
**/storage/framework/cache/*
!**/storage/framework/cache/.gitkeep
**/storage/framework/sessions/*
!**/storage/framework/sessions/.gitkeep
**/storage/framework/testing/*
!**/storage/framework/testing/.gitkeep
**/storage/framework/views/*
!**/storage/framework/views/.gitkeep
**/storage/logs/*
!**/storage/logs/.gitkeep

# Tests — couverture et artefacts Pest
**/coverage/
**/coverage.xml
**/.phpunit.result.cache
**/.pest/

# WHY on exclut phpunit.xml mais pas phpunit.xml.dist :
#   phpunit.xml est la config locale (surchargée par le dev).
#   phpunit.xml.dist est la config de référence versionnée.
**/phpunit.xml
# pest.php → versionné (config de test partagée)

# Artisan cache
**/bootstrap/cache/config.php
**/bootstrap/cache/events.php
**/bootstrap/cache/packages.php
**/bootstrap/cache/routes-v7.php
**/bootstrap/cache/services.php


# =============================================================================
# DOCKER — DONNÉES ET VOLUMES LOCAUX
# =============================================================================

# WHY on exclut les données Docker locales mais pas les config :
#   docker-compose.yml et Dockerfile sont versionnés.
#   Les données des volumes (postgres, redis, meilisearch, minio) ne le sont pas.

# Données des volumes Docker locaux (créés par docker-compose up)
docker/volumes/
docker/data/
.docker/

# PostgreSQL data directory (si monté en bind)
/var/lib/dw/

# Certificats Let's Encrypt locaux
/etc/letsencrypt/


# =============================================================================
# LOGS & TEMPORAIRES
# =============================================================================

# Logs applicatifs
*.log
*.log.*
logs/
!**/storage/logs/.gitkeep

# Logs d'installation
/var/log/dw-install.log
install.log

# Fichiers temporaires
*.tmp
*.temp
*.swp
*.swo
*~
.DS_Store
Thumbs.db
desktop.ini

# Fichiers de sauvegarde
*.bak
*.backup
*.sql.gz
pre-deploy-*.sql


# =============================================================================
# ÉDITEURS & IDE
# =============================================================================

# JetBrains (PhpStorm, WebStorm, IntelliJ)
.idea/
*.iml
*.iws
*.ipr

# VS Code
# WHY on versionne .vscode/settings.json pour partager la config d'équipe
# mais on exclut les fichiers personnels :
.vscode/*.log
.vscode/launch.json      # configurations de debug personnelles
.vscode/tasks.json       # tâches locales
# .vscode/settings.json → à versionner si accord d'équipe
# .vscode/extensions.json → à versionner (recommandations partagées)

# Vim
*.vim.bak
.netrwhist

# Emacs
*~
\#*\#
/.emacs.desktop
/.emacs.desktop.lock
*.elc
auto-save-list
tramp
.\#*

# Sublime Text
*.sublime-project
*.sublime-workspace


# =============================================================================
# SYSTÈME D'EXPLOITATION
# =============================================================================

# macOS
.DS_Store
.AppleDouble
.LSOverride
._*
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Windows
Thumbs.db
ehthumbs.db
Desktop.ini
$RECYCLE.BIN/
*.lnk

# Linux
.directory
.Trash-*


# =============================================================================
# CI/CD — ARTEFACTS LOCAUX
# =============================================================================

# Artefacts de build GitLab (ne doivent pas polluer le repo)
.gitlab/
# WHY on exclut .gitlab/ mais pas .gitlab-ci.yml :
#   .gitlab-ci.yml est la définition du pipeline — versionné.
#   .gitlab/ contiendrait des artefacts locaux si jamais créés.

# Rapports de test générés localement
test-results/
junit*.xml
coverage-report/

# Binaires temporaires de scripts
*.out
*.bin


# =============================================================================
# MEILISEARCH — DONNÉES D'INDEX LOCALES
# =============================================================================

# WHY on exclut les données Meilisearch locales :
#   L'index est reconstruit via les commandes artisan scout:import
#   au démarrage ou après un déploiement. Les données d'index ne doivent
#   pas être versionnées.
meili_data/
meilisearch-data/


# =============================================================================
# MINIO — DONNÉES LOCALES
# =============================================================================

# Données MinIO locales (montées via docker volume en dev)
minio-data/
.minio/


# =============================================================================
# SCRIPTS GÉNÉRÉS — NE PAS VERSIONNER
# =============================================================================

# Fichier .env généré par change-domain.sh
# (le script crée un .env à partir de .env.example)
# → déjà couvert par la règle .env ci-dessus


# =============================================================================
# EXCEPTIONS — FICHIERS IMPORTANTS À CONSERVER
# =============================================================================

# WHY ces exceptions explicites :
#   Certains patterns ci-dessus sont larges (ex: *.php dans bootstrap/cache).
#   On force la conservation des fichiers structurels nécessaires.

# Garder les .gitkeep pour les répertoires vides obligatoires
!**/.gitkeep

# Garder les .env.example (config de référence sans vraies valeurs)
!**/.env.example

# Garder le Dockerfile partagé
!docker/php/Dockerfile
!docker/php/php.ini
!docker/postgres/init.sql
