#!/bin/bash

# my nixos rebuild script


set -e


build_from_github(){
  export NIXPKGS_ALLOW_UNFREE=1
	export out_path=$(nix build --refresh "github:c2vi/nixos#nixosConfigurations.$host.config.system.build.toplevel" --impure --no-link --print-out-paths "${args_to_pass[@]}")

  if [[ "$out_path" == "" ]]
  then
    build_exit_code=1
  else
    build_exit_code=0
  fi

	echo out_path: $out_path
  echo build_exit_code: $build_exit_code

	return $build_exit_code
}

build_from_local(){
  export NIXPKGS_ALLOW_UNFREE=1
	export out_path=$(nix build "$HOME/work/config#nixosConfigurations.$host.config.system.build.toplevel" --impure --no-link --print-out-paths "${args_to_pass[@]}")

  if [[ "$out_path" == "" ]]
  then
    build_exit_code=1
  else
    build_exit_code=0
  fi
	
	echo out_path: $out_path
  echo build_exit_code: $build_exit_code

	return $build_exit_code
}

build_remote () {

rsync -r -v $HOME/work/config/* $host:my-nixos-config --exclude=.git --exclude=gitignore

return 0;

out_path=$(ssh $host nix build "\$HOME/my-nixos-config#nixosConfigurations.$host.config.system.build.toplevel" --impure --no-link --print-out-paths -v -L "${args_to_pass[@]}")

if [[ "$out_path" == "" ]]
then
  build_exit_code=1
else
  build_exit_code=0
fi

echo out_path: $out_path
echo build_exit_code: $build_exit_code

return $build_exit_code

}


do_switch(){
	if [[ "$host" == "$(hostname)" ]]
	then
		[[ "$boot" == "false" ]] && sudo $out_path/bin/switch-to-configuration switch
		[[ "$boot" == "true" ]] && sudo $out_path/bin/switch-to-configuration boot
  elif [[ "$build_remote" == "true" ]]
  then
		[[ "$boot" == "false" ]] && ssh $host "sudo nixos-rebuild switch --flake \$HOME/my-nixos-config --impure"
		[[ "$boot" == "true" ]] && ssh $host "sudo nixos-rebuild boot --flake \$HOME/my-nixos-config --impure"
	else
		nix path-info $out_path -r | xargs sudo nix store sign -k ~/work/here/secrets/nix-private
		nix copy --no-check-sigs --no-require-sigs --to ssh-ng://$host $out_path 
		[[ "$boot" == "false" ]] && ssh $host "sudo $out_path/bin/switch-to-configuration switch"
		[[ "$boot" == "true" ]] && ssh $host "sudo $out_path/bin/switch-to-configuration boot"
	fi
}

function test(){
  for arg in "$@";
  do
    echo got: $arg
  done
}


# main

host=$(hostname)
export host
boot=false
use_github=""
flag=""

while getopts ':rgbh:' flag; do
  case "${flag}" in
    h) host="${OPTARG}";;
    b) boot=true;;
    g) use_github=true;;
    r) build_remote=true;;
    *) export args_to_pass=( "${@:OPTIND}" ); break;; # makes it so, that at the first unknown option we start passing the rest of the arguments to the nix build command....
  esac
done

# mahem with correctly passing args to the nix build command
#args_to_pass=$(for arg in "${args_to_pass[@]}"; do echo -en " \\\"$arg\\\""; done)
#for arg in "${args_to_pass[@]}"; do echo loop: "$arg"; done
#echo hiii: $args_to_pass
#test "${args_to_pass[@]}"
#exit


if [[ "$host" == "acern" ]] || [[ "$host" == "mosatop" ]]
then
build_remote=true
fi


if [[ "$use_github" == "true" ]]
then
	echo rebuild from github
	build_from_github && do_switch
elif [[ "$build_remote" == "true" ]]
then
  build_remote && do_switch
else
	echo "rebuild from local (~/work/config/)"
	build_from_local && do_switch
fi
