#!/usr/bin/bash
# [MISE] hide=true
# [MISE] tools={"jq"="latest"}
# [MISE] depends=["docker:login"]
# [USAGE] arg "<task_name>" help="Name of task to run in docker"
# [USAGE] arg "[task_cmd]" help="Full task command to run in docker if different from task name"

set -o errexit
set -o pipefail

command=${usage_task_cmd:-${usage_task_name}}
task_slug=$(tr ':' '_' <<< "${usage_task_name}")

if [[ -n ${GITHUB_REPOSITORY} ]]; then
  image_name=ghcr.io/${GITHUB_REPOSITORY}/${task_slug}
  cache_from=type=gha
  cache_to=type=gha,mode=max
else
  image_name="ttl.sh/${USER}/$(basename "${MISE_PROJECT_ROOT}")/${task_slug}"
  cache_from=type=registry,ref=${image_name}/cache:1h
  cache_to=type=registry,ref=${image_name}/cache:1h,mode=max
fi
tag_name="${image_name}:1h"

docker buildx build --file "${MISE_TASK_DIR}/Dockerfile.task" \
  --build-arg task="${command}" \
  --build-arg MORTENLJ_MISE_LIB_VERSION="${MORTENLJ_MISE_LIB_VERSION}" \
  --build-arg MORTENLJ_MISE_LIB_CLEAN_VERSION="${MORTENLJ_MISE_LIB_CLEAN_VERSION}" \
  --cache-from "${cache_from}" \
  --cache-to "${cache_to}" \
  --load \
  --tag "${tag_name}" \
  .

container_id=$(docker container create "${tag_name}")
filelist=$(mktemp file-list-XXXXXX --suffix=".txt")
docker cp "${container_id}:/app/filelist.txt" "${filelist}"

mapfile -t patterns < <(mise tasks info "${usage_task_name?}" --json | jq -r '.outputs[]')

while IFS= read -r line; do
  if [[ -n "${line}" ]]; then # Process non-empty lines
    for pattern in "${patterns[@]}"; do
      pattern="./${pattern}"
      # shellcheck disable=SC2053
      if [[ "${line}" == ${pattern} ]]; then
        mkdir -p "$(dirname "${line}")"
        docker cp "${container_id}:/app/${line}" "${line}"
      fi
    done
  fi
done < "${filelist}"
rm "${filelist}"
docker container rm "${container_id}"
