# Magasinet KBH - Local Development Docker Compose
# Single file configuration for local development
# Usage: docker compose -f infrastructure/docker/docker-compose.yml up

services:
  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    env_file:
      - /Users/bogdantarasenko/Desktop/magasinetkbh/.env.local
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_INITDB_ARGS: --encoding=UTF-8 --lc-collate=C --lc-ctype=C
    ports:
      - "${POSTGRES_PORT}:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - app-network

  app:
    build:
      context: ../..
      dockerfile: infrastructure/docker/development/Dockerfile
      target: runner
      args:
        - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
        - BETTER_AUTH_URL=${BETTER_AUTH_URL}
        - BETTER_AUTH_EMAIL=${BETTER_AUTH_EMAIL}
        - NEXT_PUBLIC_APP_URL=${NEXT_PUBLIC_APP_URL}
    restart: unless-stopped
    ports:
      - "${APP_PORT}:3000"
      - "9229:9229"  # Node.js debug port for development
    env_file:
      - /Users/bogdantarasenko/Desktop/magasinetkbh/.env.local
    environment:
      - NODE_ENV=${NODE_ENV}
      - DATABASE_URL=${DATABASE_URL_DOCKER}
      - NEXT_PUBLIC_APP_URL=${NEXT_PUBLIC_APP_URL}
      - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
      - BETTER_AUTH_URL=${BETTER_AUTH_URL}
      - BETTER_AUTH_EMAIL=${BETTER_AUTH_EMAIL}
      # S3-compatible configuration pointing to MinIO
      - S3_ENDPOINT=${S3_ENDPOINT}
      - S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID}
      - S3_SECRET_ACCESS_KEY=${S3_SECRET_ACCESS_KEY}
      - S3_BUCKET_NAME=${S3_BUCKET_NAME}
      - S3_REGION=${S3_REGION}
      - S3_PUBLIC_URL=${S3_PUBLIC_URL}
      - S3_INTERNAL_URL=${S3_INTERNAL_URL}
      # Email configuration for Mailpit
      - SMTP_HOST=${SMTP_HOST}
      - SMTP_PORT=${SMTP_PORT}
      - SMTP_SECURE=${SMTP_SECURE}
    depends_on:
      postgres:
        condition: service_healthy
      minio:
        condition: service_healthy
    volumes:
      # Mount development environment file (.env.local created by setup_env.sh)
      - /Users/bogdantarasenko/Desktop/magasinetkbh/.env.local:/app/.env:ro
      # Mount source code for hot reloading in development
      - ../../src:/app/src:ro
      - ../../public:/app/public:ro
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    # command is handled by ENTRYPOINT in Dockerfile
    networks:
      - app-network

  # MinIO for S3-compatible file storage in development
  minio:
    image: minio/minio:latest
    restart: unless-stopped
    env_file:
      - /Users/bogdantarasenko/Desktop/magasinetkbh/.env.local
    ports:
      - "${MINIO_API_PORT}:9000"  # API port
      - "${MINIO_CONSOLE_PORT}:9001"  # Console port
    environment:
      MINIO_ROOT_USER: ${S3_ACCESS_KEY_ID}
      MINIO_ROOT_PASSWORD: ${S3_SECRET_ACCESS_KEY}
      MINIO_BROWSER_REDIRECT_URL: http://localhost:${MINIO_CONSOLE_PORT}
    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
    env_file:
      - /Users/bogdantarasenko/Desktop/magasinetkbh/.env.local
    depends_on:
      minio:
        condition: service_healthy
    entrypoint: >
      /bin/sh -c "
      /usr/bin/mc alias set myminio ${S3_ENDPOINT} ${S3_ACCESS_KEY_ID} ${S3_SECRET_ACCESS_KEY};
      /usr/bin/mc mb myminio/${S3_BUCKET_NAME} --ignore-existing;
      /usr/bin/mc anonymous set public myminio/${S3_BUCKET_NAME};
      exit 0;
      "
    networks:
      - app-network

  # Mailpit for email testing in development
  mailpit:
    image: axllent/mailpit:latest
    restart: unless-stopped
    env_file:
      - /Users/bogdantarasenko/Desktop/magasinetkbh/.env.local
    ports:
      - "${MAILPIT_WEB_PORT}:8025"  # Web interface
      - "${MAILPIT_SMTP_PORT}: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