#!/bin/sh
set -eu

NETSODY_INSTALL_LIBRARY_MODE=1
. "$(dirname "$0")/install.sh"

TEST_TMPDIR=$(mktemp -d)
cleanup() {
    rm -rf "$TEST_TMPDIR"
}
trap cleanup EXIT INT TERM HUP

uname() {
    case "$1" in
        -s)
            printf '%s\n' "$TEST_UNAME_S"
            ;;
        -m)
            printf '%s\n' "$TEST_UNAME_M"
            ;;
        *)
            command uname "$@"
            ;;
    esac
}

fail() {
    printf 'FAIL: %s\n' "$*" >&2
    exit 1
}

assert_eq() {
    expected=$1
    actual=$2
    description=$3

    if [ "$expected" != "$actual" ]; then
        fail "$description: expected '$expected', got '$actual'"
    fi
}

write_os_release() {
    path=$1
    id=$2
    id_like=$3
    pretty=$4

    cat > "$path" <<EOF
ID=$id
ID_LIKE="$id_like"
PRETTY_NAME="$pretty"
EOF
}

test_detect_platform() {
    description=$1
    TEST_UNAME_S=$2
    TEST_UNAME_M=$3
    NETSODY_INSTALL_OS_RELEASE=$4
    expected=$5

    actual=$(detect_platform "$(normalize_os)" "$(normalize_arch)")
    assert_eq "$expected" "$actual" "$description"
}

debian_release="$TEST_TMPDIR/debian-os-release"
fedora_release="$TEST_TMPDIR/fedora-os-release"
arch_release="$TEST_TMPDIR/arch-os-release"

write_os_release "$debian_release" "ubuntu" "debian" "Ubuntu 24.04 LTS"
write_os_release "$fedora_release" "fedora" "fedora" "Fedora Linux 42"
write_os_release "$arch_release" "arch" "archlinux" "Arch Linux"

test_detect_platform "ubuntu amd64" "Linux" "x86_64" "$debian_release" "linux-amd64"
test_detect_platform "fedora amd64" "Linux" "x86_64" "$fedora_release" "linux-amd64-fedora"
test_detect_platform "arch amd64" "Linux" "x86_64" "$arch_release" "linux-amd64-latest"
test_detect_platform "ubuntu arm64" "Linux" "aarch64" "$debian_release" "linux-arm64"
test_detect_platform "ubuntu armv7" "Linux" "armv7l" "$debian_release" "linux-armv7"
test_detect_platform "windows amd64" "MINGW64_NT-10.0" "x86_64" "$debian_release" "windows-amd64"
test_detect_platform "macos amd64" "Darwin" "x86_64" "$debian_release" "macos-amd64"
test_detect_platform "macos arm64" "Darwin" "arm64" "$debian_release" "macos-arm64"

assert_eq \
    "netsody_1.0.0~beta.8_amd64.deb" \
    "$(artifact_name_for_platform "linux-amd64" "1.0.0-beta.8")" \
    "linux deb artifact naming"

assert_eq \
    "netsody-1.0.0-0.beta.8.x86_64.rpm" \
    "$(artifact_name_for_platform "linux-amd64-fedora" "1.0.0-beta.8")" \
    "fedora rpm artifact naming"

assert_eq \
    "netsody-agent_1.0.0_beta8-1_x86_64.pkg.tar.zst" \
    "$(artifact_name_for_platform "linux-amd64-latest" "1.0.0-beta.8")" \
    "arch artifact naming"

assert_eq \
    "Netsody_1.0.0-beta.8_macos_x86_64.pkg" \
    "$(artifact_name_for_platform "macos-amd64" "1.0.0-beta.8")" \
    "macos amd64 artifact naming"

assert_eq \
    "Netsody_1.0.0-beta.8_macos_arm64.pkg" \
    "$(artifact_name_for_platform "macos-arm64" "1.0.0-beta.8")" \
    "macos arm64 artifact naming"

assert_eq \
    "https://download.netsody.io/binaries/linux-amd64/latest/version" \
    "$(version_url_for_platform "linux-amd64")" \
    "version url construction"

assert_eq \
    "https://download.netsody.io/binaries/linux-amd64/1.0.0-beta.8/netsody_1.0.0~beta.8_amd64.deb" \
    "$(artifact_url_for_platform "linux-amd64" "1.0.0-beta.8")" \
    "artifact url construction"

assert_eq \
    "1.0.0~beta.8" \
    "$(deb_artifact_version "1.0.0-beta.8")" \
    "debian prerelease version conversion"

nightly_runs_listing='
<a href="../">../</a>
<a href="24573872975/">24573872975/</a>
<a href="24605157710/">24605157710/</a>
<a href="24309989670/">24309989670/</a>
'

nightly_linux_listing='
<a href="../">../</a>
<a href="netsody">netsody</a>
<a href="netsody-agent_1.0.0_beta8-1_x86_64.pkg.tar.zst">netsody-agent_1.0.0_beta8-1_x86_64.pkg.tar.zst</a>
<a href="netsody-ui_1.0.0~beta.8_amd64.deb">netsody-ui_1.0.0~beta.8_amd64.deb</a>
<a href="netsody_1.0.0~beta.8_amd64.deb">netsody_1.0.0~beta.8_amd64.deb</a>
'

nightly_fedora_listing='
<a href="../">../</a>
<a href="netsody-1.0.0-0.beta.8.x86_64.rpm">netsody-1.0.0-0.beta.8.x86_64.rpm</a>
'

assert_eq \
    "24605157710" \
    "$(extract_nightly_run_ids "$nightly_runs_listing" | sort -nr | head -n 1)" \
    "nightly run id sorting"

assert_eq \
    "netsody_1.0.0~beta.8_amd64.deb" \
    "$(select_nightly_artifact_name "linux-amd64" "$nightly_linux_listing")" \
    "nightly deb artifact selection"

assert_eq \
    "netsody-agent_1.0.0_beta8-1_x86_64.pkg.tar.zst" \
    "$(select_nightly_artifact_name "linux-amd64-latest" "$nightly_linux_listing")" \
    "nightly arch artifact selection"

assert_eq \
    "netsody-1.0.0-0.beta.8.x86_64.rpm" \
    "$(select_nightly_artifact_name "linux-amd64-fedora" "$nightly_fedora_listing")" \
    "nightly rpm artifact selection"

nightly_empty_listing='
<a href="../">../</a>
'

nightly_runs_root_url=$(nightly_runs_url)
nightly_missing_platform_url=$(nightly_platform_url "24605157710" "linux-amd64")
nightly_empty_platform_url=$(nightly_platform_url "24573872975" "linux-amd64")
nightly_complete_platform_url=$(nightly_platform_url "24309989670" "linux-amd64")

fetch_text() {
    case "$1" in
        "$nightly_runs_root_url")
            printf '%s\n' "$nightly_runs_listing"
            ;;
        *)
            fail "unexpected fetch_text URL: $1"
            ;;
    esac
}

try_fetch_text() {
    case "$1" in
        "$nightly_missing_platform_url")
            return 1
            ;;
        "$nightly_empty_platform_url")
            printf '%s\n' "$nightly_empty_listing"
            ;;
        "$nightly_complete_platform_url")
            printf '%s\n' "$nightly_linux_listing"
            ;;
        *)
            return 1
            ;;
    esac
}

expected_nightly_selection='24309989670
netsody_1.0.0~beta.8_amd64.deb'

assert_eq \
    "$expected_nightly_selection" \
    "$(select_latest_nightly_artifact "linux-amd64" 2>/dev/null)" \
    "nightly selection skips incomplete newer runs"

assert_eq \
    "1.0.0~beta.8" \
    "$(display_version_from_artifact_name "linux-amd64" "netsody_1.0.0~beta.8_amd64.deb")" \
    "nightly deb version extraction"

assert_eq \
    "1.0.0_beta8-1" \
    "$(display_version_from_artifact_name "linux-amd64-latest" "netsody-agent_1.0.0_beta8-1_x86_64.pkg.tar.zst")" \
    "nightly arch version extraction"

assert_eq \
    "1.0.0-beta.8" \
    "$(display_version_from_artifact_name "macos-amd64" "Netsody_1.0.0-beta.8_macos_x86_64.pkg")" \
    "macos amd64 version extraction"

assert_eq \
    "https://artifacts.netsody.io/runs/24605157710/linux-amd64/" \
    "$(nightly_platform_url "24605157710" "linux-amd64")" \
    "nightly platform url construction"

debian_install_command=$(
    INSTALL_SH_PATH="$(cd "$(dirname "$0")" && pwd)/install.sh"
    NETSODY_INSTALL_LIBRARY_MODE=1 INSTALL_SH_PATH="$INSTALL_SH_PATH" sh <<'EOF'
. "$INSTALL_SH_PATH"
have_cmd() {
    [ "$1" = "dpkg" ]
}
resolve_privilege_tool() {
    printf '%s\n' ""
}
run_with_privilege() {
    printf '%s\n' "$*"
}
install_downloaded_artifact "linux-arm64" "/tmp/netsody.deb"
EOF
)

assert_eq \
    "dpkg -i /tmp/netsody.deb" \
    "$debian_install_command" \
    "debian installation uses dpkg for local package installs"

validate_platform_override_compatibility "linux" "amd64" "linux-amd64-fedora"
validate_platform_override_compatibility "macos" "amd64" "macos-amd64"

if (validate_platform_override_compatibility "linux" "arm64" "windows-amd64") >/dev/null 2>&1; then
    fail "override compatibility guard should reject cross-platform overrides"
fi

printf '%s\n' "install tests passed"
