version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    env_file: .env
    environment:
      DATABASE_URL: ${DATABASE_URL}
      DB_HOST: ${DB_HOST}
      DB_PORT: ${DB_PORT}
      DB_NAME: ${DB_NAME}
      DB_USER: ${DB_USER}
      DB_PASSWORD: ${DB_PASSWORD}
      SECRET_KEY_BASE: ${SECRET_KEY_BASE}
      RAILS_ENV: ${RAILS_ENV:-development}
    volumes:
      - ".:/app"
      - "bundle_cache:/usr/local/bundle"
    # No boot/deploy, em ordem:
    #  1. db:prepare  — cria o banco se não existir, roda migrations pendentes e
    #     só faz seed se o banco acabou de ser criado (idempotente, seguro).
    #  2. whenever --update-crontab — grava no crontab os jobs do config/schedule.rb
    #     (ex.: atualizar histórico a cada 30 min, 08h-18h).
    #  3. cron — sobe o daemon de cron (em background) que executa esses jobs.
    #     As variáveis de ambiente do banco vêm do .env via dotenv-rails quando
    #     o rake carrega o Rails, então o cron não precisa herdar o ENV.
    #  4. rails s — sobe a aplicação (processo em primeiro plano).
    # O passo do cron é "best-effort": se o crontab/cron não estiver disponível
    # (ex.: imagem antiga sem o pacote `cron`), apenas avisa no log e SEGUE —
    # nunca impede o Rails de subir. (Requer rebuild: docker compose up -d --build)
    # `bundle check || bundle install`: os gems ficam num VOLUME nomeado
    # (bundle_cache) que persiste e SOMBREIA os gems da imagem — então adicionar
    # uma gem nova ao Gemfile não chega no container só com `up`/`--build`. Este
    # passo instala o que faltar no volume no boot (idempotente e rápido quando já
    # está tudo instalado), evitando o Bundler::GemNotFound ao subir.
    command: bash -c "rm -f tmp/pids/server.pid && (bundle check || bundle install) && bundle exec rails db:prepare && { bundle exec whenever --update-crontab && cron || echo '[boot] AVISO cron/crontab indisponivel (rode com --build), seguindo sem agendamento'; } && bundle exec rails s -b 0.0.0.0"
    # O banco PostgreSQL já existe externamente.
    # Configure DB_HOST no .env com o IP/hostname do seu servidor PostgreSQL.

volumes:
  bundle_cache:
