services:

  # --- Service PHP ---
  # Conteneur pour exécuter l'application Symfony (requêtes web)
  php:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
      args:
        # Utilise l'UID/GID de l'hôte pour éviter les problèmes de permissions
        UID: ${UID:-1000}
        GID: ${GID:-1000}
    container_name: crm_php
    environment:
        - XDEBUG_MODE=coverage
    volumes:
      # Monte le code source de l'application dans le conteneur
      - ./:/srv/app
      # Monte le socket Docker pour permettre l'exécution de commandes docker depuis le conteneur
      - /var/run/docker.sock:/var/run/docker.sock
      - ./coverage:/opt/phpstorm-coverage
      - ./.coverage:/opt/phpstorm-coverage
    depends_on:
      # S'assure que la base de données et Redis sont démarrés avant PHP
      - db
      - redis
    networks:
      - crm_network # Assignation au réseau commun

  # --- Service Worker pour Symfony Messenger ---
  # Conteneur dédié à l'exécution des messages en arrière-plan
  messenger-worker:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
      args:
        UID: ${UID:-1000}
        GID: ${GID:-1000}
    container_name: crm_messenger_worker
    # Commande pour lancer le worker. 'async' est le nom du transport par défaut.
    command: php bin/console messenger:consume async --memory-limit=128M --time-limit=3600
    volumes:
      - ./:/srv/app
      # Monte aussi le socket Docker ici pour la cohérence
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - db
      - redis
    networks:
      - crm_network # Assignation au réseau commun

  # --- Service Frontend (Bun + Vite) ---
  # Conteneur pour compiler les assets JS/CSS en développement
  bun:
    image: oven/bun:1-slim
    container_name: crm_bun
    # Exécute les commandes avec l'utilisateur de l'hôte pour éviter les problèmes de permissions sur node_modules
    user: "${UID:-1000}:${GID:-1000}"
    working_dir: /usr/src/app
    volumes:
      - ./:/usr/src/app
    ports:
      # Port par défaut du serveur de développement Vite
      - "5173:5173"
    # Lance le serveur de développement Vite défini dans package.json
    command: bun run dev
    networks:
      - crm_network # Assignation au réseau commun

  # --- Service Serveur Web (Caddy) ---
  # Serveur web moderne qui sert l'application et gère le PHP-FPM
  caddy:
    image: caddy:2-alpine
    container_name: crm_caddy
    ports:
      # Mappe le port 8000 de l'hôte au port 80 du conteneur
      - "8000:80"
    volumes:
      # Monte le fichier de configuration de Caddy
      - ./docker/caddy/Caddyfile:/etc/caddy/Caddyfile
      # Monte le code source pour servir les fichiers statiques
      - ./:/srv/app
    depends_on:
      - php
    networks:
      - crm_network # Assignation au réseau commun

  # --- Service Base de Données principale (PostgreSQL) ---
  db:
    image: postgres:16-alpine
    container_name: crm_db
    ports:
        - "5432:5432"
    environment:
      POSTGRES_DB: app_db
      POSTGRES_USER: symfony_user
      POSTGRES_PASSWORD: ChangeMeInProd!
    volumes:
      # Volume nommé pour la persistance des données
      - db_data:/var/lib/postgresql/data
    networks:
      - crm_network # Assignation au réseau commun

  # --- Service Cache/Messenger (Redis) ---
  redis:
    image: redis:7-alpine
    container_name: crm_redis
    networks:
      - crm_network # Assignation au réseau commun

  # --- Service de Test d'Emails (MailHog) ---
  # Intercepte tous les emails envoyés en développement
  mailhog:
    image: axllent/mailpit:latest
    ports:
        - "1025:1025"
        - "8025:8025"
    networks:
        - crm_network # Assignation au réseau commun

# Définition des volumes pour la persistance des données
volumes:
  db_data: # Pour la base de données principale de Symfony

# Définition des réseaux
networks:
  crm_network: # Définition du réseau commun
    driver: bridge # Le type de driver le plus courant
