# Note: Docker Compose version is no longer required in modern versions

services:
  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${POSTGRES_DB:-magasinetkbh}
      POSTGRES_USER: ${POSTGRES_USER:-postgres}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres_password}
    ports:
      - '5432:5432'
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test:
        [
          'CMD-SHELL',
          'pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-magasinetkbh}'
        ]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - app-network

  app:
    build:
      context: ../..
      dockerfile: infrastructure/docker/Dockerfile
    restart: unless-stopped
    ports:
      - '3000:3000'
    env_file:
      - ../../.env
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres_password}@postgres:5432/${POSTGRES_DB:-magasinetkbh}
      - NEXT_PUBLIC_APP_URL=${NEXT_PUBLIC_APP_URL:-http://localhost:3000}
      - BETTER_AUTH_SECRET=447f298edd747783eb7042b55ae510e686af341c13751a07ba116311a84bf7ca
      - BETTER_AUTH_URL=${BETTER_AUTH_URL:-http://localhost:3000}
      # S3-compatible configuration pointing to MinIO
      - S3_ENDPOINT=http://minio:9000
      - S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID:-minioadmin}
      - S3_SECRET_ACCESS_KEY=${S3_SECRET_ACCESS_KEY:-minioadmin123}
      - S3_BUCKET_NAME=${S3_BUCKET_NAME:-magasinetkbh-uploads}
      - S3_REGION=${S3_REGION:-us-east-1}
      - S3_PUBLIC_URL=http://minio:9000
    depends_on:
      postgres:
        condition: service_healthy
      minio:
        condition: service_healthy
    # Use the standalone server.js created by Next.js build
    # command is defined in Dockerfile as CMD ["node", "server.js"]
    volumes:
      # Mount development environment file (create .env.local from env.example)
      - ../../.env:/app/.env:ro
    networks:
      - app-network

  # MinIO for S3-compatible file storage in development
  minio:
    image: minio/minio:latest
    restart: unless-stopped
    ports:
      - '9000:9000' # API port
      - '9001:9001' # Console port
    environment:
      MINIO_ROOT_USER: ${S3_ACCESS_KEY_ID:-minioadmin}
      MINIO_ROOT_PASSWORD: ${S3_SECRET_ACCESS_KEY:-minioadmin123}
    volumes:
      - minio_data:/data
    command: server /data --console-address ":9001"
    healthcheck:
      test: ['CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live']
      interval: 30s
      timeout: 20s
      retries: 3
    networks:
      - app-network

  # MinIO client for bucket initialization
  minio-setup:
    image: minio/mc:latest
    depends_on:
      minio:
        condition: service_healthy
    entrypoint: >
      /bin/sh -c "
      /usr/bin/mc alias set myminio http://minio:9000 ${S3_ACCESS_KEY_ID:-minioadmin} ${S3_SECRET_ACCESS_KEY:-minioadmin123};
      /usr/bin/mc mb myminio/${S3_BUCKET_NAME:-magasinetkbh-uploads} --ignore-existing;
      /usr/bin/mc policy set public myminio/${S3_BUCKET_NAME:-magasinetkbh-uploads};
      exit 0;
      "
    networks:
      - app-network

  # Mailpit for email testing in development
  mailpit:
    image: axllent/mailpit:latest
    restart: unless-stopped
    ports:
      - '8025:8025' # Web interface
      - '1025:1025' # SMTP server
    environment:
      MP_SMTP_AUTH_ACCEPT_ANY: 1
      MP_SMTP_AUTH_ALLOW_INSECURE: 1
    networks:
      - app-network

volumes:
  postgres_data:
  minio_data:

networks:
  app-network:
    driver: bridge
