#!/usr/bin/env nix-shell
#! nix-shell -i bash --pure -p cacert curl jq nix xq-xml
# shellcheck shell=bash

set -euo pipefail

cd "$(readlink -e "$(dirname "${BASH_SOURCE[0]}")")"

# Ensure pager is unset for xq
unset PAGER

DARWIN_DATA="$(curl -sSf https://d32ifkf9k9ezcg.cloudfront.net/production/sparkle/appcast.xml)"
AARCH64_LINUX_DATA="$(curl -sSf --header 'Accept: application/tuple.app; version=1' \
  "https://production.tuple.app/latest_version/linux?arch=arm64")"
X86_64_LINUX_DATA="$(curl -sSf --header 'Accept: application/tuple.app; version=1' \
  "https://production.tuple.app/latest_version/linux?arch=x86_64")"

DARWIN_VERSION="$(xq --xpath '//rss/channel/item[1]/sparkle:shortVersionString' <<<"${DARWIN_DATA}")"
AARCH64_LINUX_VERSION="$(jq --raw-output '
  .version
  | ltrimstr("v")
  | if test("^\\d{4}_\\d{2}_\\d{2}\\.\\d+$") then
      .
      | sub("\\.\\d+$"; "")
      | gsub("_"; "-")
      | "0-unstable-\(.)"
    else . end
' <<<"${AARCH64_LINUX_DATA}")"
X86_64_LINUX_VERSION="$(jq --raw-output '
  .version
  | ltrimstr("v")
  | if test("^\\d{4}_\\d{2}_\\d{2}\\.\\d+$") then
      .
      | sub("\\.\\d+$"; "")
      | gsub("_"; "-")
      | "0-unstable-\(.)"
    else . end
' <<<"${X86_64_LINUX_DATA}")"

DARWIN_URL="$(xq --xpath '//rss/channel/item[1]/enclosure/@url' <<<"${DARWIN_DATA}")"
AARCH64_LINUX_URL="$(jq --raw-output '.url' <<<"${AARCH64_LINUX_DATA}")"
X86_64_LINUX_URL="$(jq --raw-output '.url' <<<"${X86_64_LINUX_DATA}")"

darwin_hash=$(nix-prefetch-url --unpack "${DARWIN_URL}" --name "tuple-${DARWIN_VERSION}")
aarch64_linux_hash=$(nix-prefetch-url "${AARCH64_LINUX_URL}" --name "tuple-${AARCH64_LINUX_VERSION}")
x86_64_linux_hash=$(nix-prefetch-url "${X86_64_LINUX_URL}" --name "tuple-${X86_64_LINUX_VERSION}")

# use friendlier hashes

darwin_hash=$(nix --extra-experimental-features nix-command hash convert --to sri --hash-algo sha256 "${darwin_hash}")
aarch64_linux_hash=$(nix --extra-experimental-features nix-command hash convert --to sri --hash-algo sha256 "${aarch64_linux_hash}")
x86_64_linux_hash=$(nix --extra-experimental-features nix-command hash convert --to sri --hash-algo sha256 "${x86_64_linux_hash}")

cat >sources.nix <<EOF
# Generated by ./update.sh - do not update manually!
# Last updated: $(date +%F)
{ fetchurl, fetchzip }:
{
  aarch64-darwin = {
    version = "${DARWIN_VERSION}";
    src = fetchzip {
      url = "${DARWIN_URL}";
      hash = "${darwin_hash}";
    };
  };
  aarch64-linux = {
    version = "${AARCH64_LINUX_VERSION}";
    src = fetchurl {
      url = "${AARCH64_LINUX_URL}";
      hash = "${aarch64_linux_hash}";
    };
  };
  x86_64-linux = {
    version = "${X86_64_LINUX_VERSION}";
    src = fetchurl {
      url = "$X86_64_LINUX_URL";
      hash = "${x86_64_linux_hash}";
    };
  };
}
EOF
