#!/usr/bin/env bash

# {{ managedText | raw }}

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

{% if not php.phpcs is same as false %}
  test --testdox
{% endif %}

{% if not php.phpcs is same as false and not php.phpstan is same as false %}
  quality
{% endif %}
}

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

{% if not php.phpcs is same as false %}
function coding-standards {
  cmd phpcs "${@}"
}
{% endif %}

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"
}

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

{% if not php.phpcs is same as false and not php.phpstan is same as false %}
function quality {
{% if not php.phpcs is same as false %}
  coding-standards
{% endif %}
{% if not php.phpstan is same as false %}
  static-analysis
{% endif %}
}
{% endif %}

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

  docker compose up -d
}

{% if not php.phpstan is same as false %}
function static-analysis {
  cmd phpstan --memory-limit=-1 --no-progress "${@}"
}
{% endif %}

function stop {
  docker compose down
}

{% if not php.phpunit is same as false %}
function test {
  _exec php phpunit --colors=always "${@}"
}
{% endif %}

function test:commit {
{% if not php.phpunit is same as false %}
  test --testdox --testsuite functional
  test --testdox --testsuite kernel
  test --testdox --testsuite unit
{% endif %}

  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