#!/bin/sh

set -eu

CONFIG_DIR="${HOME}/.photoproofing"
CONFIG_FILE="${CONFIG_DIR}/config.json"
DEFAULT_BASE_URL='https://api.photoproofing.it'

prompt() {
  label="$1"
  default_value="${2:-}"

  if [ -n "${default_value}" ]; then
    printf '%s [%s]: ' "${label}" "${default_value}" >&2
  else
    printf '%s: ' "${label}" >&2
  fi

  IFS= read -r value
  if [ -z "${value}" ]; then
    value="${default_value}"
  fi

  printf '%s' "${value}"
}

extract_gallery_id() {
  if command -v jq >/dev/null 2>&1; then
    jq -r '.data[0].id // empty' "$1"
    return
  fi

  sed -n 's/.*"id":"\([^"]*\)".*/\1/p' "$1" | head -n 1
}

extract_gallery_list() {
  if command -v jq >/dev/null 2>&1; then
    jq -r '.data[] | [.id, .title] | @tsv' "$1"
    return
  fi

  return 1
}

TMP_FILE="$(mktemp)"
trap 'rm -f "${TMP_FILE}"' EXIT INT TERM

mkdir -p "${CONFIG_DIR}"

printf 'PhotoProofing Capture One setup\n\n'

API_KEY="$(prompt 'API key')"
BASE_URL="$(prompt 'Base URL' "${DEFAULT_BASE_URL}")"

STATUS_CODE="$({
  curl -sS -o "${TMP_FILE}" -w '%{http_code}' \
    -H "Authorization: Bearer ${API_KEY}" \
    "${BASE_URL}/v1/galleries"
} || true)"

if [ "${STATUS_CODE}" -lt 200 ] || [ "${STATUS_CODE}" -ge 300 ]; then
  printf 'Unable to validate API key (%s).\n' "${STATUS_CODE}" >&2
  cat "${TMP_FILE}" >&2
  exit 1
fi

printf '\nAPI key validated successfully.\n'

GALLERY_ID=''

if command -v jq >/dev/null 2>&1; then
  printf '\nAvailable galleries:\n'
  index=1
  extract_gallery_list "${TMP_FILE}" | while IFS="$(printf '\t')" read -r id title; do
    printf '  %s) %s [%s]\n' "${index}" "${title}" "${id}"
    index=$((index + 1))
  done

  printf '\nType a gallery ID, or leave blank to create a new gallery.\n'
  GALLERY_ID="$(prompt 'Gallery ID')"
else
  printf '\njq is not installed, falling back to manual gallery selection.\n'
  GALLERY_ID="$(prompt 'Gallery ID (leave blank to create a new gallery)')"
fi

if [ -z "${GALLERY_ID}" ]; then
  TITLE="$(prompt 'New gallery title')"
  STATUS_CODE="$({
    curl -sS -o "${TMP_FILE}" -w '%{http_code}' \
      -X POST "${BASE_URL}/v1/galleries" \
      -H "Authorization: Bearer ${API_KEY}" \
      -H 'Content-Type: application/json' \
      -d "{\"title\":\"${TITLE}\",\"status\":\"proofing\"}"
  } || true)"

  if [ "${STATUS_CODE}" -lt 200 ] || [ "${STATUS_CODE}" -ge 300 ]; then
    printf 'Unable to create gallery (%s).\n' "${STATUS_CODE}" >&2
    cat "${TMP_FILE}" >&2
    exit 1
  fi

  GALLERY_ID="$(extract_gallery_id "${TMP_FILE}")"
fi

printf '{\n  "apiKey": "%s",\n  "galleryId": "%s",\n  "baseUrl": "%s"\n}\n' \
  "${API_KEY}" "${GALLERY_ID}" "${BASE_URL}" > "${CONFIG_FILE}"

printf '\nSaved configuration to %s\n' "${CONFIG_FILE}"
printf 'Gallery ID: %s\n' "${GALLERY_ID}"
