#!/usr/bin/env zsh

use scwrypts/environment

#####################################################################

USAGE__options+="
	-m, --mode <string>   set the execution mode for update
	   edit        (default) edit the current environment
	   copy        copy one environment to another
	   delete      permanently delete an existing environment
	   recursive   (somewhat advanced) from deepest parent to target environment, edit all related environments in order
	   advanced    (dangerous) API mode; requires a '--' and additional arguments

	-n, --name   name of the environment to update (default is current '$SCWRYPTS_ENV')\n$(scwrypts.environment.common.get-env-names | sed 's/^/   /')

	--advanced-help   help doc for advanced mode
"

USAGE__description='
	interactive utility for scwrypts environment managment
'

# program exists immediately after running, so environment changes
# cannot cause errors if this script is run on it's own
[[ $SUBSCWRYPT -eq 0 ]] \
	&& export __SCWRYPTS_ENVIRONMENT__WORKFLOW_IS_CHANGE_SAFE=true

#####################################################################

MAIN() {
	local MODE=edit
	local ENVIRONMENT_NAME

	local ARGS=()

	local _S ERRORS=0
	while [[ $# -gt 0 ]]
	do
		_S=1
		case $1 in
			( --advanced-help )
				scwrypts.environment.update --help
				return 0
				;;

			( -m | --mode )
				[ $2 ] && ((_S+=1)) || echo.error "missing mode name" || break
				case $2 in
					edit | copy | delete | recursive | advanced )
						MODE="$2"
						;;
					* ) echo.error "invalid mode '$MODE'" ;;
				esac
				;;

			( -n | --name )
				[ $2 ] && ((_S+=1)) || echo.error "missing environment name" || break
				ENVIRONMENT_NAME="$2"
				;;

			( -- ) shift 1; ADVANCED_ARGS=($@); break ;;
			(  * ) echo.error "unknown argument '$1'" ;;
		esac
		shift $_S
	done

	utils.check-errors --fail

	case $MODE in
		( edit )
			[ "$ENVIRONMENT_NAME" ] || ENVIRONMENT_NAME="$SCWRYPTS_ENV"
			;;
		( copy )
			local SOURCE_ENVIRONMENT="$(scwrypts.environment.common.get-env-names | utils.fzf 'select an environment to copy')"
			[ "$SOURCE_ENVIRONMENT" ] || echo.error.user-abort || return 1

			[ "$ENVIRONMENT_NAME" ] || ENVIRONMENT_NAME=$(echo | utils.fzf.user-input 'new environment name')
			[ "$ENVIRONMENT_NAME" ] || echo.error.user-abort || return 1
			;;
		( delete )
			[ "$ENVIRONMENT_NAME" ] || ENVIRONMENT_NAME="$(scwrypts.environment.common.get-env-names | utils.fzf 'select an environment to delete')"
			[ "$ENVIRONMENT_NAME" ] || echo.error.user-abort || return 1
			;;
		( advanced )
			[ "$ENVIRONMENT_NAME" ] || ENVIRONMENT_NAME="$SCWRYPTS_ENV"
	esac

	[ -f "$(scwrypts.environment.common.get-env-file "$ENVIRONMENT_NAME" scwrypts)" ] \
		&& local ENVIRONMENT_EXISTS=true \
		|| local ENVIRONMENT_EXISTS=false \
		;

	case $MODE in
		( edit )
			case $ENVIRONMENT_EXISTS in
				( true ) ;;
				( false )
					echo.warning "environment $ENVIRONMENT_NAME does not exist"
					Yn "create new environment '$ENVIRONMENT_NAME'?" || echo.error.user-abort || return 1
					;;
			esac
			;;

		( copy )
			ARGS+=(--create-from-existing "$SOURCE_ENVIRONMENT")
			case $ENVIRONMENT_EXISTS in
				( true )
					echo.error "target environment '$ENVIRONMENT_NAME' already exists; refusing to copy"
					;;
				( false ) ;;
			esac
			;;

		( delete )
			ARGS+=(--mode delete)
			case $ENVIRONMENT_EXISTS in
				( true )
					echo.reminder 'deleting an environment is PERMANENT\nmake sure your credentials are backed up!'
					yN "are you sure you want to delete '$ENVIRONMENT_NAME'?" || echo.error.user-abort || return 1
					;;
				( false )
					echo.error "environment '$ENVIRONMENT_NAME' does not exist (can't delete it if it's not there)"
					;;
			esac
			;;

		( recursive )
			ARGS+=(--mode recursive)
			case $ENVIRONMENT_EXISTS in
				( true ) ;;
				( false )
					echo.error "environment '$ENVIRONMENT_NAME' does not exist; please create it before attempting recursive edit"
					;;
			esac
			;;

		( advanced )
			echo.warning "operating in advanced mode; I hope you know what you are doing!"
			;;
	esac

	utils.check-errors --no-usage

	##########################################

	ARGS+=(--environment-name $ENVIRONMENT_NAME)

	scwrypts.environment.update ${ARGS[@]}
}
