#!/nix/store/fdjz8wqw1yfh3pb58vrsswc30qwz42mx-bash-interactive-5.3p3/bin/bash

PATH="/nix/store/xs8scz9w9jp4hpqycx3n3bah5y07ymgj-coreutils-9.8/bin:/nix/store/qqvfnxa9jg71wp4hfg1l63r4m78iwvl9-findutils-4.10.0/bin:/nix/store/22r4s6lqhl43jkazn51f3c18qwk894g4-gnugrep-3.12/bin:$PATH"
IS_DARWIN="no"

set -eu
set -o pipefail

DEBUG=0
MARKDOWN=0
HOST_OS=0
SANDBOX=0
while true; do
    case "${1:-}" in
        "")
            break
            ;;
        -d | --debug)
            set -x
            DEBUG=1
            shift
            ;;
        -m | --markdown)
            MARKDOWN=1
            HOST_OS=1
            SANDBOX=1
            shift
            ;;
        --host-os)
            HOST_OS=1
            shift
            ;;
        --sandbox)
            SANDBOX=1
            shift
            ;;

        * )
            cat <<EOF
nix-info - get high level info to help with debugging

Options:

 -m, --markdown   formatting for a GitHub issue
                  implies: --host-os, --sandbox

     --sandbox    include sandbox configuration
     --host-os    include host OS details

 -h, --help       show this message
 -d, --debug      debug mode

EOF
            case "${1:-}" in
                -h|--help)
                    exit 0
                    ;;
                *)
                    exit 1
                    ;;
            esac
    esac
done

debuglog() {
    if [ $DEBUG -eq 1 ]; then
        cat >&2
    else
        cat > /dev/null
    fi
}

nixev() {
    nix-instantiate --eval --strict -E "$1"
}

desc_system() {
    nixev 'builtins.currentSystem'
}

desc_host_os() {
    printf "%s" "$(uname -sr)"

    if [ "$IS_DARWIN" = "yes" ]; then
        printf ", macOS %s" "$(sw_vers -productVersion)"
    fi

    if [ -f /etc/os-release ]; then
        (
            # shellcheck disable=SC1091
            . /etc/os-release
            printf ", %s, %s, %s" "${NAME:-$(uname -v)}" "${VERSION:-noversion}" "${BUILD_ID:-nobuild}"
        )
    fi
}

desc_multi_user() {
    if nix-build --no-out-link  /nix/store/qdv28rq2xlj68lsgrar938dq38v2lh5b-multiuser.nix 2>&1 | debuglog; then
        printf "yes"
    else
        printf "no"
    fi
}

desc_nixpkgs_path() {
    nixev '<nixpkgs>' 2>/dev/null || echo "not found"
}

channel_facts() {
    find /nix/var/nix/profiles/per-user \
         -mindepth 2 \
         -maxdepth 2 \
         -name channels \
         -print0 \
    |\
    while  IFS= read -r -d '' userchannelset; do
        manifest="$userchannelset/manifest.nix"

        if [ -e "$manifest" ]; then
            userchannels=$(nixev \
                           "builtins.concatStringsSep \", \"
                             (map (ch: ch.name)
                               (import \"$manifest\"))")

            fact "channels($(echo "$manifest" | cut -d/ -f7))" \
                 "$userchannels"
        fi
    done
}

desc_sandbox() {
    if nix-build --no-out-link /nix/store/6602zq9jmd3r4772ajw866nkzn6gk1j0-sandbox.nix 2>&1 | debuglog; then
        printf "no"
    elif nix-build --no-out-link /nix/store/30qhz45nwgfyns13ijq0nwrsjp8m7ypa-relaxedsandbox.nix 2>&1 | debuglog; then
        printf "relaxed"
    else
        printf "yes"
    fi
}

fact() {
    name="${1:-0}"
    value="${2:-0}"
    last="${3:-1}"
    if [ $MARKDOWN -eq 0 ]; then
        printf "%s: %s" "$name" "$value"
        if [ "$last" -eq 1 ]; then
            printf ", "
        fi
    else
        printf " - %s: \`%s\`\\n" "$name" "$value"
    fi

    if [ "$last" -eq 0 ]; then
        echo ""
    fi
}

last_fact() {
    fact "$1" "$2" 0
}

fact "system" "$(desc_system)"
if [ $HOST_OS -eq 1 ]; then
    fact "host os" "$(desc_host_os)"
fi
fact "multi-user?" "$(desc_multi_user)"
if [ $SANDBOX -eq 1 ]; then
    fact "sandbox" "$(desc_sandbox)"
fi

fact "version" "$(nix-env --version)"
channel_facts
last_fact "nixpkgs" "$(desc_nixpkgs_path)"
