services:
  traefik-proxy:
    image: traefik:2.11.29
    labels:
      - traefik.enable=true
      - traefik.docker.network=kbh-traefik-proxy
    networks:
      - kbh-traefik-proxy
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    command:
      --api.dashboard=true
      --api.insecure=true
      --log.level=DEBUG
      --providers.docker=true
      --providers.docker.exposedByDefault=false
      --entryPoints.http.address=:80

  app:
    build:
      context: .
      dockerfile: ./Dockerfile
      target: nginx
      cache_from:
        - ${REGISTRY_IMAGE:-localhost}/app-nginx:dev
    image: ${REGISTRY_IMAGE:-localhost}/app-nginx:dev
    volumes:
      - ./:/app
      - ./public:/app/public
    networks:
      - kbh-traefik-proxy
      - app-network
    labels:
      - traefik.enable=true
      - traefik.docker.network=kbh-traefik-proxy
      - traefik.http.routers.app.rule=Host(`app.localhost`)
      - traefik.http.routers.app.entryPoints=http
      - traefik.http.services.app.loadBalancer.server.port=80

  app-node:
    image: ${REGISTRY_IMAGE:-localhost}/app-node:dev
    build:
      context: .
      dockerfile: ./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}
      cache_from:
        - ${REGISTRY_IMAGE:-localhost}/app-node:dev
    restart: unless-stopped
    ports:
      - '3000:3000'
      - "9229:9229"
    env_file:
      - .env
    environment:
      HOSTNAME: "0.0.0.0"
      PORT: "3000"
      DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}
      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}
      # Migration configuration
      #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_ENDPOINT}
      # Email configuration for Mailpit
      SMTP_HOST: ${SMTP_HOST}
      SMTP_PORT: ${SMTP_PORT}
      SMTP_SECURE: ${SMTP_SECURE}
      # Stripe configuration
      STRIPE_SECRET_KEY: ${STRIPE_SECRET_KEY}
      STRIPE_WEBHOOK_SECRET: ${STRIPE_WEBHOOK_SECRET}
      NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: ${NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY}
    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
      - ./public:/app/public
      - ./migrate.js:/app/migrate.js
      - ./src:/app/src
    working_dir: /app
    command: ["node", "--inspect=0.0.0.0:9229", "server.js"]
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    networks:
      - app-network

  app-node-cli:
    image: ${REGISTRY_IMAGE:-localhost}/app-node:dev
    environment:
      DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}
      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}
      # Migration configuration
      #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_ENDPOINT}
      # Email configuration for Mailpit
      SMTP_HOST: ${SMTP_HOST}
      SMTP_PORT: ${SMTP_PORT}
      SMTP_SECURE: ${SMTP_SECURE}
      # Stripe configuration
      STRIPE_SECRET_KEY: ${STRIPE_SECRET_KEY}
      STRIPE_WEBHOOK_SECRET: ${STRIPE_WEBHOOK_SECRET}
      NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: ${NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY}
    volumes:
      - .env:/app/.env:ro
      - ./public:/app/public
      - ./migrate.js:/app/migrate.js
      - ./src:/app/src
    working_dir: /app
    networks:
      - app-network

  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    env_file:
      - .env
    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

  mysql:
    image: mysql:8.4
    restart: unless-stopped
    env_file:
      - .env
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE:-mkbh_legacy}
      MYSQL_USER: ${MYSQL_USER:-enigma}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD:-secret}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-secret}
    ports:
      - "${MYSQL_PORT:-3306}:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    healthcheck:
      test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p${MYSQL_ROOT_PASSWORD:-secret} --silent"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - app-network

  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"
    labels:
      - traefik.enable=true
      - traefik.docker.network=kbh-traefik-proxy

      - traefik.http.routers.minio.rule=Host(`storage-console.localhost`)
      - traefik.http.routers.minio.entryPoints=http
      - traefik.http.routers.minio.service=minio
      - traefik.http.services.minio.loadBalancer.server.port=9001

      - traefik.http.routers.minio-public.rule=Host(`storage.localhost`) && PathPrefix(`/{{ env S3_BUCKET_NAME }}`)
      - traefik.http.routers.minio-public.entryPoints=http
      - traefik.http.routers.minio-public.service=minio-public
      - traefik.http.services.minio-public.loadBalancer.server.port=9000
    healthcheck:
      test: ['CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live']
      interval: 30s
      timeout: 20s
      retries: 3
    networks:
      - app-network
      - kbh-traefik-proxy

  minio-setup:
    image: minio/mc:latest
    restart: no
    depends_on:
      minio:
        condition: service_healthy
    entrypoint: >
      /bin/sh -c "
      mc alias set myminio http://minio:9000 ${S3_ACCESS_KEY_ID:-minioadmin} ${S3_SECRET_ACCESS_KEY:-minioadmin123};
      mc mb myminio/${S3_BUCKET_NAME:-magasinetkbh-uploads} --ignore-existing;
      mc anonymous set public myminio/${S3_BUCKET_NAME:-magasinetkbh-uploads};
      exit 0;
      "
    networks:
      - app-network

  mailpit:
    image: axllent/mailpit:v1.27.9
    restart: unless-stopped
    ports:
      - 8025:8025
      - 1025:1025
    env_file:
      - .env
    networks:
      - kbh-traefik-proxy
      - app-network
    labels:
      - traefik.enable=true
      - traefik.docker.network=kbh-traefik-proxy
      - traefik.http.routers.mailpit.rule=Host(`mailer.localhost`)
      - traefik.http.routers.mailpit.entryPoints=http
      - traefik.http.services.mailpit.loadBalancer.server.port=8025

  stripe-cli:
    image: stripe/stripe-cli
    command: listen --forward-to ${DOCKER_STRIPE_WEBHOOK_URL:-app:3000}/api/auth/stripe/webhook
    profiles: [stripe]
    environment:
      - STRIPE_API_KEY=${STRIPE_SECRET_KEY}
    networks:
      - app-network

volumes:
  postgres_data:
  mysql_data:
  minio_data:

networks:
  app-network:
    name: ${DOCKER_NETWORK:-kbh_app-network}
    external: ${DOCKER_NETWORK_EXTERNAL:-false}
  kbh-traefik-proxy:
    name: kbh-traefik-proxy
