#!/bin/env fish
begin
    set -l dir (status dirname)
    source "$(status dirname)/../../Scripts/software.fish"

    function getSWName
        echo "git"
    end

    function configureSW -S -V dir -a scope name
        source "$dir/../../Scripts/config.fish"
        set -l root
        set -l user
        set -l configArgs

        function setConfig -S
            sudo -u "$user" git config $configArgs $argv
        end

        if [ -z "$scope" ] || [ "$scope" = "system" ]
            set root "valhalla"
            set user "root"
            set configArgs "--system"
        else
            set root "valhalla.users.$name"
            set user "$name"
            set configArgs "--global"
            set -l displayName "$root.displayName"
            set -l mailAddress "$root.mailAddress"

            if isSet "$displayName"
                setConfig user.name (getConfig "$displayName")
            end

            if isSet "$mailAddress"
                setConfig user.email (getConfig "$mailAddress")
            end
        end

        set -l branch "$root.git.defaultBranch"

        if isSet "$branch"
            setConfig init.defaultBranch (getConfig "$branch")
        end

        begin # Git Flow
            set -l dir (mktemp -d)

            pushd "$dir" > /dev/null
            begin
                set -l key valhalla.git.flow
                set -l mainKey "$key.mainBranch"
                set -l devKey "$key.devBranch"

                git init
                git commit --allow-empty -m "Initial commit" > /dev/null
                git branch master || true &> /dev/null
                git branch main || true &> /dev/null
                git branch dev || true &> /dev/null
                yes "" | git flow init &> /dev/null

                if isSet "$mainKey"
                    sudo git flow config set $configArgs master (getConfig "$mainKey") > /dev/null
                else
                    true
                end

                if isSet "$devKey"
                    sudo git flow config set $configArgs develop (getConfig "$devKey") > /dev/null
                else
                    true
                end
            end
            popd > /dev/null

            rm -rf "$dir"
        end

        begin # Aliases
            set -l key "$root.git.aliases"
            set -l aliases (getConfig "$key" --json)

            for name in (echo "$aliases" | jq 'keys[]' --raw-output0 | string split0)
                setConfig "alias.$name" (getConfig "$key.$name")
            end
        end
    end

    runInstaller $argv
end