#!/bin/bash

set -ex

TEMPLATE_DIR=$1
if [ -z "${TEMPLATE_DIR}" ]; then echo "template dir required"; exit 1; fi
PROG_TYPE=$2
if [ -z "${PROG_TYPE}" ]; then echo "program type required"; exit 1; fi

TMP_DIR=$(mktemp -d)
clean_up() {
    # shellcheck disable=SC2317
    rm -rf "${TMP_DIR}"
}
trap clean_up EXIT

pushd "${TMP_DIR}"
case "${PROG_TYPE}" in
    "cgroup_sockopt")
	    ADDITIONAL_ARGS=(-d sockopt_target=getsockopt)
        ;;
    "classifier"|"cgroup_skb")
        ADDITIONAL_ARGS=(-d direction=Ingress)
        ;;
    "fentry"|"fexit")
        ADDITIONAL_ARGS=(-d fn_name=try_to_wake_up)
        ;;
    "kprobe"|"kretprobe")
        ADDITIONAL_ARGS=(-d kprobe=test)
        ;;
    "lsm")
        ADDITIONAL_ARGS=(-d lsm_hook=file_open)
        ;;
    "raw_tracepoint")
        ADDITIONAL_ARGS=(-d tracepoint_name=sys_enter)
        ;;
    "sk_msg")
        ADDITIONAL_ARGS=(-d sock_map=SOCK_MAP)
        ;;
    "tp_btf")
	    ADDITIONAL_ARGS=(-d tracepoint_name=net_dev_queue)
        ;;
    "tracepoint")
	    ADDITIONAL_ARGS=(-d tracepoint_category=net -d tracepoint_name=net_dev_queue)
        ;;
    "uprobe"|"uretprobe")
        ADDITIONAL_ARGS=(-d uprobe_target=testlib -d uprobe_fn_name=testfn)
        ;;
    *)
        ADDITIONAL_ARGS=()
esac

cargo generate --path "${TEMPLATE_DIR}" -n test -d program_type="${PROG_TYPE}" "${ADDITIONAL_ARGS[@]}"
pushd test
cargo +nightly fmt --all -- --check
cargo build --package test
cargo build --package test --release
# We cannot run clippy over the whole workspace at once due to feature unification. Since both test
# and test-ebpf depend on test-common and test activates test-common's aya dependency, we end up
# trying to compile the panic handler twice: once from the bpf program, and again from std via aya.
cargo clippy --exclude test-ebpf --all-targets --workspace -- --deny warnings
cargo clippy --package test-ebpf --all-targets -- --deny warnings
popd
exit 0