---
version: '3'

vars:
  ENV_GOBIN:
    sh: mktemp
  ENV_GOROOT:
    sh: mktemp
  ENV_PATH:
    sh: mktemp

env:
  AUTO_COMMIT_MESSAGE: 'false'
  PREPARE_PROJECT: 'true'
  UPDATE_GIT_REPOS: 'true'

tasks:
  ci:
    run: once
    cmds:
      - task: setup
    status:
      - '[ -n "$CI" ]'

  commit:
    run: once
    cmds:
      - task: commit:auto
      - task: commit:manual
    status:
      - '[ -z "$AUTO_COMMIT" ]'

  commit:auto:
    run: once
    cmds:
      - task: :commit:quick
      - task: :ci:synchronize
    status:
      - '[ "$AUTO_COMMIT_MESSAGE" != "true" ]'

  commit:manual:
    run: once
    cmds:
      - task: :commit:all
      - task: :ci:synchronize
    status:
      - '[ "$AUTO_COMMIT_MESSAGE" == "true" ]'

  dev:
    cmds:
      - task: setup
    status:
      - '([ -z "$CI" ] && [ -f /.dockerenv ])'

  devcontainer:
    cmds:
      - task: :install:modules:local
      - task: :install:python:requirements:poetry
      - task: :git:remotes
    status:
      - '[ ! -f /.devcontainer ]'

  docker:
    cmds:
      - task: docker:taskfile
    status:
      - '[ "{{.DOCKER_BUILDING}}" != "true" ]'

  docker:taskfile:
    cmds:
      - task: :deps:run:parallel
    status:
      - '[ ! -f Taskfile.yml ]'

  init:
    run: once
    log:
      error: Error encountered while initializing the update process
      start: Initializing the update process
      success: Finished initializing the update process
    cmds:
      - task: :ci:before
      - task: :ci:submodules
      - task: :repair

  prepare:
    run: once
    cmds:
      - task: :prepare
    status:
      - '[ "$PREPARE_PROJECT" != "true" ] || [ -f /.devcontainer ]'

  prereqs:
    env:
      PATH:
        sh: |
          if type brew &> /dev/null; then
            echo "$PATH"
          else
            . "$HOME/.profile" &> /dev/null
            echo "$PATH"
          fi
    run: once
    log:
      error: Error encountered while installing pre-requisite software
      start: Ensuring pre-requisite software is installed and added to the PATH
      success: Pre-requisite software is installed
    cmds:
      - task: :install:software:jq
      - task: :install:software:yq
      - task: :install:software:node
      - task: :install:software:poetry
      - task: :install:software:go

  register:env:
    cmds:
      - |
        . "$HOME/.profile" &> /dev/null
        echo "$PATH" > '{{.ENV_PATH}}'
        echo "$GOBIN" > '{{.ENV_GOBIN}}'
        echo "$GOROOT" > '{{.ENV_GOROOT}}'
    status:
      - type jq &> /dev/null
      - type yq &> /dev/null
      - type node &> /dev/null
      - type go &> /dev/null
      - type poetry &> /dev/null
      - '[ -n "$GOBIN" ]'
      - '[ -n "$GOROOT" ]'

  setup:
    run: once
    cmds:
      - task: :install:software:brew
      - task: prereqs
      - task: register:env
        vars:
          ENV_GOBIN: '{{.ENV_GOBIN}}'
          ENV_GOROOT: '{{.ENV_GOROOT}}'
          ENV_PATH: '{{.ENV_PATH}}'
      - task: setup:start
        env:
          GOBIN:
            sh: cat '{{.ENV_GOBIN}}'
          GOROOT:
            sh: cat '{{.ENV_GOROOT}}'
          PATH:
            sh: cat '{{.ENV_PATH}}'

  setup:start:
    run: once
    cmds:
      - task: setup:start:ci
      - task: setup:start:dev

  setup:start:ci:
    run: once
    cmds:
      - task: init
      - task: prepare
      - task: update
      - task: :ci:commit
      - task: :ci:synchronize
    status:
      - '[ -z "$CI" ]'

  setup:start:dev:
    run: once
    cmds:
      - task: init
      - task: prepare
      - task: update
      - task: commit
      - task: devcontainer
    status:
      - '[ -n "$CI" ]'

  update:
    run: once
    cmds:
      - task: :upstream:{{.PROJECT_TYPE}}
      - task: update:git
    status:
      - '[ "$UPDATE_PROJECT" == "true" ] || [ -f /.devcontainer ]'

  update:git:
    run: once
    cmds:
      - task: :git:update
    status:
      - '[ -n "$CI" ] || [ "{{.DOCKER_BUILDING}}" == "true" ]'
      - '[ "$UPDATE_GIT_REPOS" == "false" ] || [ "{{.DOCKER_BUILDING}}" == "true" ]]'
