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

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

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

        if [ -z "$name" ]
            set user "root"
            set configArgs "--system"
        else
            set root "$root.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)

            begin
                set -l key "$root.git.flow"
                set -l mainKey "$key.mainBranch"
                set -l devKey "$key.devBranch"

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

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

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

            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

    function configureSW -S -V dir
        configureGit
    end

    function userConfig -S -V dir -a name
        configureGit "$name"
    end

    runInstaller $argv
end