#!/bin/sh
# hakocms-cli を入れるスクリプト（Linux と macOS）。https://www.hakocms.net/download
#
#   curl -fsSL https://www.hakocms.net/install.sh | sh
#
# いちばん新しい版を download.hakocms.net から取り、SHA256SUMS で確かめてから置く。
# 環境変数で変えられるもの：
#   HAKOCMS_CLI_VERSION      入れる版（例：0.1.8）。空なら latest.json の版
#   HAKOCMS_CLI_INSTALL_DIR  置く場所。空なら ~/.local/bin
#
# 中身はすべて main の中にある。ダウンロードが途中で切れたときに、途中までを実行しないため
set -eu

main() {
  base="https://download.hakocms.net/hakocms-cli"
  dir="${HAKOCMS_CLI_INSTALL_DIR:-$HOME/.local/bin}"

  command -v curl >/dev/null 2>&1 || die "curl が見つかりません"
  command -v tar >/dev/null 2>&1 || die "tar が見つかりません"

  case "$(uname -s)" in
    Linux) os="unknown-linux-musl" ;;
    Darwin) os="apple-darwin" ;;
    *) die "この OS には対応していません（$(uname -s)）。Windows は https://www.hakocms.net/download から zip をダウンロードしてください" ;;
  esac
  case "$(uname -m)" in
    x86_64 | amd64) arch="x86_64" ;;
    aarch64 | arm64) arch="aarch64" ;;
    *) die "この CPU には対応していません（$(uname -m)）" ;;
  esac
  # Intel 版のシェルを Rosetta で動かしている Apple シリコンの Mac では、uname -m が x86_64 を返す
  if [ "$os" = "apple-darwin" ] && [ "$arch" = "x86_64" ] && [ "$(sysctl -n hw.optional.arm64 2>/dev/null || true)" = "1" ]; then
    arch="aarch64"
  fi
  target="$arch-$os"

  version="${HAKOCMS_CLI_VERSION:-}"
  version="${version#v}"
  if [ -z "$version" ]; then
    version="$(curl -fsSL "$base/latest.json" | sed -n 's/^ *"version": *"\([^"]*\)".*/\1/p' | head -n 1)"
    [ -n "$version" ] || die "最新の版を $base/latest.json から読めませんでした"
  fi
  case "$version" in
    *[!0-9A-Za-z.+-]*) die "版の番号が正しくありません（${version}）" ;;
  esac

  name="hakocms-cli-v$version-$target"
  tmp="$(mktemp -d)"
  trap 'rm -rf "$tmp"' EXIT
  trap 'exit 1' INT TERM

  say "hakocms-cli v${version}（${target}）をダウンロードしています"
  curl -fsSL -o "$tmp/$name.tar.gz" "$base/v$version/$name.tar.gz" || die "ダウンロードできませんでした：$base/v$version/$name.tar.gz"
  curl -fsSL -o "$tmp/SHA256SUMS" "$base/v$version/SHA256SUMS" || die "SHA256SUMS をダウンロードできませんでした"

  want="$(awk -v f="$name.tar.gz" '$2 == f { print $1 }' "$tmp/SHA256SUMS")"
  [ -n "$want" ] || die "SHA256SUMS に $name.tar.gz がありません"
  if command -v sha256sum >/dev/null 2>&1; then
    got="$(sha256sum "$tmp/$name.tar.gz" | awk '{ print $1 }')"
  elif command -v shasum >/dev/null 2>&1; then
    got="$(shasum -a 256 "$tmp/$name.tar.gz" | awk '{ print $1 }')"
  else
    die "sha256sum も shasum も見つからないので、SHA-256 を確かめられません"
  fi
  [ "$got" = "$want" ] || die "SHA-256 が合いません（期待 ${want}、実際 ${got}）"

  tar -xzf "$tmp/$name.tar.gz" -C "$tmp"
  mkdir -p "$dir"
  # 置き換えるときに動いている実行ファイルを壊さないよう、同じ場所に書いてから mv で入れ替える
  cp "$tmp/$name/hakocms-cli" "$dir/.hakocms-cli.tmp"
  chmod 755 "$dir/.hakocms-cli.tmp"
  mv -f "$dir/.hakocms-cli.tmp" "$dir/hakocms-cli"

  say "$dir/hakocms-cli に置きました"
  case ":$PATH:" in
    *":$dir:"*) say "新しい端末で hakocms-cli version を実行して確かめてください" ;;
    *)
      say ""
      say "$dir は PATH に入っていません。シェルの設定ファイル（~/.zshrc や ~/.bashrc）に次の行を足してください："
      say ""
      say "  export PATH=\"$dir:\$PATH\""
      ;;
  esac
}

say() {
  printf '%s\n' "$1"
}

die() {
  printf 'エラー：%s\n' "$1" >&2
  exit 1
}

main "$@"
