#!/bin/env fish
function runSetup
    set -l dir (status dirname)
    source "$dir/../../lib/action.fish"
    set -l projectRoot (realpath "$dir/../../..")
    set -l projectName (basename "$projectRoot")
    set -l PROJECT_CLONE_ROOT "/opt/$(basename "$projectName")"

    function setupAction -V projectRoot -V PROJECT_CLONE_ROOT
        source "$dir/../../lib/hooks.fish"
        source "$dir/../../lib/settings.fish"
        set -l mountDir (getOSConfig partition.rootDir)
        set -l script (mktemp)
        chmod +x "$script"

        if not type -q runChroot
            function runChroot -S
                command chroot $argv
            end
        end

        function getCloneFile -S -a path
            set -l relativeDir (realpath --relative-to "$projectRoot" "$dir")
            set -l relativePath (realpath --relative-to "$dir" "$path")
            echo "$PROJECT_CLONE_ROOT/$relativeDir/$relativePath"
        end

        function runInOS -S
            set -l script /root/run_once
            wrapScript $argv | chroot "$mountDir" tee "$script" >/dev/null
            and runChroot "$mountDir" chmod +x "$script"
            and runChroot "$mountDir" "$script"
            and runChroot "$mountDir" rm "$script"
        end

        function wrapScript -S
            printf %s\n \
                "cd $PROJECT_CLONE_ROOT" \
                "$argv"
        end

        and echo "Cloning project..."
        and source "$dir/../../lib/copy-repo.fish" "$mountDir$PROJECT_CLONE_ROOT"
        runChroot "$mountDir" git config --system --add safe.directory "$PROJECT_CLONE_ROOT"
        and runHook setupOS

        and echo "Preparing auto-login..."
        and runHook --force autologin "Please set up a function `autologin` for  setting up autologin for the `root` user"

        and begin
            set -l script (string escape (getCloneFile (getInstallerScript)))

            wrapScript (
                string join " " \
                    "CONFIG_NAME=$(string escape "$CONFIG_NAME")" \
                    (string escape $script))

        end | runChroot "$mountDir" tee /root/.bash_profile >/dev/null
    end

    function prepareNix
        source "$dir/../../lib/nix.fish"

        # Copy `nixpkgs` channel
        mkdir -p (dirname "$mountDir/$nixPkgsDir")
        cp -r "$nixPkgsDir" "$mountDir/$nixPkgsDir"
    end

    function actionPreRun
        echo "Partitioning drives..."
        and getOSConfig partition.script >"$script"
        and "$script"
        and rm "$script"
    end

    function actionPostRun
        echo "Setup finished!"
        and echo "This machine will reboot in 5 seconds..."
        and echo "Press CTRL-C to abort..."
        and sleep 5
        and systemctl reboot
    end

    runAction setupAction
end