#!/bin/env fish
function isConfigured -S
    set -q CONFIG_NAME
end

function selectProfile -S -a result
    source "$(status dirname)/../../lib/modules/partition/select.fish"
    set -l file (mktemp)
    set -l header NAME
    set -l profiles

    getProfiles | jq ".[]" --raw-output0 | string split0 | while read profile
        set -a profiles "$profile"
    end

    select "$header" "$file" \
        "Please choose a profile" \
        "No profiles specified" \
        "$(string collect $profiles)"

    set -g "$result" (cat "$file")
    rm "$file"
end

function getProfiles -S
    source "$(status dirname)/eval-flake.fish"
    evalFlake "" "" --apply "builtins.attrNames" --json
end

function getConfig -S -a property
    source "$(status dirname)/eval-flake.fish"
    evalFlake "$CONFIG_NAME" "$property" $argv[2..]
end

function getOSConfigRoot
    echo "valhalla.linux"
end

function getOSConfig -S -a property
    getConfig "$(getOSConfigRoot).$property" $argv[2..]
end

function getProgramConfig -S
    argparse -i "name=" "user=" -- $argv
    set -l name $_flag_name
    set -l user $_flag_user
    set -l option "programs.$name"

    if [ -z "$name" ]
        set name $argv[1]
        set argv $argv[2..]
    end

    if [ -z "$user" ]
        getOSConfig "$option" $argv --fallback "{}"
    else
        getUserConfig "$user" "$option" $argv --fallback "{}"
    end
end

function getAttributes -S -a property
    getConfig "$property" --apply "builtins.attrNames" --json
end

function getUsers -S
    getAttributes "$(getOSConfigRoot).users"
end

function getUserConfig -S -a name property
    getOSConfig "users.$name.$property" $argv[3..]
end

function isSet -S -a property
    not test "$(getConfig "$property" --json)" = null
end

function isOSSet -S -a property
    isSet "$(getOSConfigRoot).$property"
end

function isUserSet -S -a name property
    isOSSet "users.$name.$property"
end

function isEnabled -S -a property
    getConfig "$property" --json | jq --exit-status >/dev/null
end

function isProgramEnabled -S
    argparse -i "user=" "name=" -- $argv
    getProgramConfig --user "$_flag_user" --name "$_flag_name" --json 2>/dev/null | jq --exit-status ".enable" >/dev/null
end

function isOSEnabled -S -a property
    isEnabled "$(getOSConfigRoot).$property"
end

function collectionActive -S -a name
    isOSEnabled "software.$name"
end