#!/usr/bin/env bash

# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.

set -o errexit
set -o pipefail

# If we're running in CI we need to disable TTY allocation for docker compose
# commands that enable it by default, such as exec and run.
TTY="${TTY:-}"
if [[ ! -t 1 ]]; then
  TTY="-T"
fi

# Run automated tests as part of the Continuous Integration (CI) pipeline.
function ci:test {
  lint:dockerfile

  docker compose version

  docker network create traefik_proxy

  cp --no-clobber .env.example .env

  docker compose build --progress plain

  docker compose up --detach
  docker compose logs

  composer install --quiet --no-progress

  test --testdox

  quality
}

# Run a command within the php container.
function cmd {
  docker compose exec php "${@}"
}

function coding-standards {
  cmd phpcs "${@}"
}

function composer {
  _exec php composer "${@}"
}

function drush {
  _exec php drush "${@}"
}

function git-hooks:off {
  git config --unset core.hooksPath
}

function git-hooks:on {
  git config core.hooksPath .githooks
}

# Display a list of all available commands.
function help {
  printf "%s <task> [args]\n\nTasks:\n" "${0}"

  compgen -A function | grep -v "^_" | cat -n

  printf "\nExtended help:\n  Each task has comments for general usage\n"
}

# Install Drupal.
function install {
  drush site:install -y "${@}"
}

function lint:dockerfile {
  docker container run --rm -i \
    hadolint/hadolint hadolint --ignore DL3008 --ignore DL3059 -t style "${@}" - < Dockerfile
}

function quality {
  coding-standards
  static-analysis
}

function start {
  cp -v --no-clobber .env.example .env || true

  docker compose up -d
}

function static-analysis {
  cmd phpstan --memory-limit=-1 --no-progress "${@}"
}

function stop {
  docker compose down
}

function test {
  _exec php phpunit --colors=always "${@}"
}

function test:commit {
  test --testdox --testsuite functional
  test --testdox --testsuite kernel
  test --testdox --testsuite unit

  quality
}

function _exec {
  docker compose exec ${TTY} "${@}"
}

function _run {
  local service="${1}"
  local command="${2}"

  docker compose run \
    --entrypoint "${command}" \
    --no-deps \
    --rm \
    ${TTY} \
    "${service}" "${@}"
}

# Include any local tasks.
[[ -e run.local ]] && source run.local

TIMEFORMAT=$'\nTask completed in %3lR'
time "${@:-help}"

# vim: ft=bash