#!/usr/bin/env nix-shell
#!nix-shell -i bash -p git nix jq coreutils gnugrep gnused curl common-updater-scripts
# shellcheck shell=bash
set -euo pipefail

nixpkgs="$(git rev-parse --show-toplevel || (printf 'Could not find root of nixpkgs repo\nAre we running from within the nixpkgs git repo?\n' >&2; exit 1))"

stripwhitespace() {
    sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}

narhash() {
    nix --extra-experimental-features nix-command store prefetch-file --json "$1" | jq -r .hash
}

findpath() {
    path="$(nix --extra-experimental-features nix-command eval --json --impure -f "$nixpkgs" "$1.meta.position" | jq -r . | cut -d: -f1)"
    outpath="$(nix --extra-experimental-features nix-command eval --json --impure --expr "fetchGit \"$nixpkgs\"")"

    if [ -n "$outpath" ]; then
        path="${path/$(echo "$outpath" | jq -r .)/$nixpkgs}"
    fi

    echo "$path"
}

getcmakevar() {
    local var="$1" text="$2"
    local out
    out="$(echo "$text" | grep -F "set($var " | head -n1 | sed -e "s/set($var //" -e 's/)[[:space:]]*$//' | tr -d '"' | stripwhitespace)"

    while [[ "$out" =~ (\$\{([A-Za-z_][A-Za-z0-9_]*)\}) ]]; do
        local match="${BASH_REMATCH[1]}"
        local var2="${BASH_REMATCH[2]}"
        local value
        value="$(getcmakevar "$var2" "$text")"
        out="${out//$match/$value}"
    done

    echo "$out"
}

getcmakehash() {
    local var="$1" text="$2"
    local hex
    hex="$(getcmakevar "$var" "$text" | sed -e 's/^SHA256=//')"
    nix --extra-experimental-features nix-command hash convert --hash-algo sha256 --to sri "$hex"
}

attr="${UPDATE_NIX_ATTR_PATH:-curl-impersonate}"
version="$(curl -sSL "https://api.github.com/repos/lexiforest/curl-impersonate/releases/latest" | jq -r .tag_name | sed -e 's/^v//')"

pkgpath="$(findpath "$attr")"

updated="$(cd "$nixpkgs" && update-source-version "$attr" "$version" --file="$pkgpath" --print-changes | jq -r length)"

if [ "$updated" -eq 0 ]; then
    echo 'update.sh: Package version not updated, nothing to do.'
    exit 0
fi

cmakelists="$(curl -sSL "https://github.com/lexiforest/curl-impersonate/raw/v$version/CMakeLists.txt")"
buildlibidn2="$(curl -sSL "https://github.com/lexiforest/curl-impersonate/raw/v$version/scripts/build-libidn2.sh")"

libidn2_version="$(echo "$buildlibidn2" | grep -F 'libidn2_version=' | head -n1 | sed -e 's/.*:-\(.*\)}/\1/')"
libidn2_url="https://ftp.gnu.org/gnu/libidn/libidn2-$libidn2_version.tar.gz"

cat >"$(dirname "$pkgpath")"/deps.nix <<EOF
# Generated by update.sh
{ fetchurl }:

{
  "$(getcmakevar CURL_VERSION "$cmakelists").tar.gz" = fetchurl {
    url = "$(getcmakevar CURL_URL "$cmakelists")";
    hash = "$(getcmakehash CURL_URL_HASH "$cmakelists")";
  };

  "brotli-$(getcmakevar BROTLI_VERSION "$cmakelists").tar.gz" = fetchurl {
    url = "$(getcmakevar BROTLI_URL "$cmakelists")";
    hash = "$(getcmakehash BROTLI_URL_HASH "$cmakelists")";
  };

  "boringssl-$(getcmakevar BORINGSSL_COMMIT "$cmakelists").zip" = fetchurl {
    url = "$(getcmakevar BORINGSSL_URL "$cmakelists")";
    hash = "$(getcmakehash BORINGSSL_URL_HASH "$cmakelists")";
  };

  "nghttp2-$(getcmakevar NGHTTP2_VERSION "$cmakelists").tar.bz2" = fetchurl {
    url = "$(getcmakevar NGHTTP2_URL "$cmakelists")";
    hash = "$(getcmakehash NGHTTP2_URL_HASH "$cmakelists")";
  };

  "ngtcp2-$(getcmakevar NGTCP2_VERSION "$cmakelists").tar.bz2" = fetchurl {
    url = "$(getcmakevar NGTCP2_URL "$cmakelists")";
    hash = "$(getcmakehash NGTCP2_URL_HASH "$cmakelists")";
  };

  "nghttp3-$(getcmakevar NGHTTP3_VERSION "$cmakelists").tar.bz2" = fetchurl {
    url = "$(getcmakevar NGHTTP3_URL "$cmakelists")";
    hash = "$(getcmakehash NGHTTP3_URL_HASH "$cmakelists")";
  };

  "zlib-$(getcmakevar ZLIB_VERSION "$cmakelists").tar.gz" = fetchurl {
    url = "$(getcmakevar ZLIB_URL "$cmakelists")";
    hash = "$(getcmakehash ZLIB_URL_HASH "$cmakelists")";
  };

  "zstd-$(getcmakevar ZSTD_VERSION "$cmakelists").tar.gz" = fetchurl {
    url = "$(getcmakevar ZSTD_URL "$cmakelists")";
    hash = "$(getcmakehash ZSTD_URL_HASH "$cmakelists")";
  };

  "libidn2-$libidn2_version.tar.gz" = fetchurl {
    url = "$libidn2_url";
    hash = "$(narhash "$libidn2_url")";
  };
}
EOF
