#!/usr/bin/env sh
set -eu

ORIGIN="https://install.disparachat.com"
INSTALL_PATH="/usr/local/bin/disparachat-installer"
STATE_PATH="/etc/disparachat-installer/state.json"

if [ -t 1 ] && [ -z "${NO_COLOR+x}" ]; then
  color_cyan="$(printf '\033[1;36m')"
  color_green="$(printf '\033[1;32m')"
  color_red="$(printf '\033[1;31m')"
  color_reset="$(printf '\033[0m')"
else
  color_cyan=""
  color_green=""
  color_red=""
  color_reset=""
fi

fail() {
  printf '\n%sErro:%s %s\n' "$color_red" "$color_reset" "$1" >&2
  exit 1
}

[ "$(id -u)" -eq 0 ] || fail "execute com sudo: curl -fsSL https://install.disparachat.com | sudo bash"
[ -r /dev/tty ] || fail "execute o comando em um terminal SSH interativo"

case "$(uname -m)" in
  x86_64|amd64)
    architecture="amd64"
    ;;
  aarch64|arm64)
    architecture="arm64"
    ;;
  *)
    fail "arquitetura nao suportada: $(uname -m); use amd64 ou arm64"
    ;;
esac

for command_name in awk curl sha256sum install mktemp; do
  command -v "$command_name" >/dev/null 2>&1 || fail "comando obrigatorio nao encontrado: ${command_name}"
done

# Sem override, instala a versao publicada em /latest. O override existe para
# validar uma versao numa VPS descartavel ANTES de ela virar a `latest` de todo
# mundo. `ORIGIN` continua fixo de proposito: a origem confiavel do binario nao
# pode depender do ambiente de quem cola o comando, e a verificacao de
# SHA256SUMS abaixo vale igual nos dois caminhos.
if [ -n "${DISPARACHAT_INSTALLER_VERSION:-}" ]; then
  VERSION="$DISPARACHAT_INSTALLER_VERSION"
  version_origin="pedida por DISPARACHAT_INSTALLER_VERSION"
else
  VERSION="$(curl -fsSL --retry 3 --retry-delay 2 "${ORIGIN}/latest")"
  version_origin="publicada em ${ORIGIN}/latest"
fi
printf '%s\n' "$VERSION" | awk '/^v[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z0-9][A-Za-z0-9.-]*)?$/ { valid=1 } END { exit !valid }' \
  || fail "versao invalida (${version_origin}): ${VERSION}"
BASE_URL="${ORIGIN}/downloads/${VERSION}"

asset="disparachat-installer-linux-${architecture}"
temporary_dir="$(mktemp -d)"
cleanup() {
  rm -rf -- "$temporary_dir"
}
trap cleanup EXIT HUP INT TERM

printf '%sBaixando DisparaChat Installer%s %s para Linux %s...\n' "$color_cyan" "$color_reset" "$VERSION" "$architecture"
if [ -n "${DISPARACHAT_INSTALLER_VERSION:-}" ]; then
  printf 'Versao pedida no ambiente, nao a publicada. Use so para validar em VPS descartavel.\n'
fi
# Sem esta mensagem, uma versao inexistente falharia com o 404 mudo do curl —
# erro provavel agora que a versao pode vir do ambiente.
curl -fsSL --retry 3 --retry-delay 2 "${BASE_URL}/${asset}" -o "${temporary_dir}/${asset}" \
  || fail "nao foi possivel baixar ${VERSION} para ${architecture}; confira se a versao existe em ${ORIGIN}/downloads/"
curl -fsSL --retry 3 --retry-delay 2 "${BASE_URL}/SHA256SUMS" -o "${temporary_dir}/SHA256SUMS" \
  || fail "nao foi possivel baixar o SHA256SUMS de ${VERSION}"

checksum_line="$(awk -v file="$asset" '$2 == file { print; exit }' "${temporary_dir}/SHA256SUMS")"
[ -n "$checksum_line" ] || fail "checksum do binario nao encontrado"
printf '%s\n' "$checksum_line" | (cd "$temporary_dir" && sha256sum -c -)

install -m 0755 "${temporary_dir}/${asset}" "$INSTALL_PATH"
printf '%s✓%s Binario verificado e instalado em %s.\n\n' "$color_green" "$color_reset" "$INSTALL_PATH"

installer_command="install"
if [ -f "$STATE_PATH" ]; then
  installer_command="update"
fi
exec "$INSTALL_PATH" "$installer_command" </dev/tty
