#!/bin/sh

set -eu

CONFIG_DIR="${HOME}/.photoproofing"
CONFIG_FILE="${CONFIG_DIR}/config.json"
LOG_FILE="${CONFIG_DIR}/upload.log"

log() {
  mkdir -p "${CONFIG_DIR}"
  printf '%s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" >> "${LOG_FILE}"
}

read_config_value() {
  key="$1"

  if command -v jq >/dev/null 2>&1; then
    jq -r ".${key} // empty" "${CONFIG_FILE}"
    return
  fi

  sed -n "s/.*\"${key}\"[[:space:]]*:[[:space:]]*\"\([^\"]*\)\".*/\1/p" "${CONFIG_FILE}" | head -n 1
}

is_supported_image() {
  case "$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')" in
    *.jpg|*.jpeg|*.png|*.webp|*.tif|*.tiff) return 0 ;;
    *) return 1 ;;
  esac
}

if [ "$#" -lt 1 ]; then
  printf 'Usage: %s /absolute/path/to/file\n' "$0" >&2
  exit 1
fi

FILE_PATH="$1"

if [ ! -f "${FILE_PATH}" ]; then
  printf 'File not found: %s\n' "${FILE_PATH}" >&2
  exit 1
fi

if [ ! -f "${CONFIG_FILE}" ]; then
  printf 'Missing config file: %s\nRun photoproofing-setup.sh first.\n' "${CONFIG_FILE}" >&2
  exit 1
fi

if ! is_supported_image "${FILE_PATH}"; then
  printf 'Unsupported file type: %s\n' "${FILE_PATH}" >&2
  exit 1
fi

API_KEY="$(read_config_value apiKey)"
GALLERY_ID="$(read_config_value galleryId)"
BASE_URL="$(read_config_value baseUrl)"

if [ -z "${API_KEY}" ] || [ -z "${GALLERY_ID}" ]; then
  printf 'apiKey or galleryId missing in %s\n' "${CONFIG_FILE}" >&2
  exit 1
fi

if [ -z "${BASE_URL}" ]; then
  BASE_URL='https://api.photoproofing.it'
fi

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

STATUS_CODE="$({
  curl -sS -o "${TMP_FILE}" -w '%{http_code}' \
    -X POST "${BASE_URL}/v1/galleries/${GALLERY_ID}/images" \
    -H "Authorization: Bearer ${API_KEY}" \
    -F "file=@${FILE_PATH}"
} || true)"

if [ "${STATUS_CODE}" -ge 200 ] && [ "${STATUS_CODE}" -lt 300 ]; then
  log "SUCCESS ${FILE_PATH} ${STATUS_CODE}"
  printf 'Uploaded: %s\n' "${FILE_PATH}"
  cat "${TMP_FILE}"
  exit 0
fi

log "ERROR ${FILE_PATH} ${STATUS_CODE} $(cat "${TMP_FILE}")"
printf 'Upload failed (%s): %s\n' "${STATUS_CODE}" "${FILE_PATH}" >&2
cat "${TMP_FILE}" >&2
exit 1
