#!/bin/bash

notes() {
	local NOTES_DIR="${NOTES_DIR:-${HOME}/notes}"
	local -r EDITOR="${EDITOR:-vim}"
	local EDITOR_OPTIONS=()

	if [[ "${EDITOR}" =~ 'vim$' ]]; then
		EDITOR_OPTIONS=(
			'-c'
			'set spell'
		)
	fi


	for ARG in "$@"; do
		(
			set -euo pipefail
			mkdir -p "$NOTES_DIR"
			cd "$NOTES_DIR"

			case "${ARG}" in
				'category')
					shift
					export NOTES_DIR="$NOTES_DIR/$1"
					shift

					notes "$@"
					exit 255
					;;

				'fzf')
					"${EDITOR}" "${EDITOR_OPTIONS[@]}" "$(notes ls | fzf)"
					;;

				'ls')
					ag -g '' -l "${NOTES_DIR}" | sort -hr
					;;

				'status')
					git status
					;;

				'commit')
					git add .
					git commit -m "notes commit $(strftime '%a %d %b %Y %r %Z')"
					;;

				'push')
					git push
					;;

				'pull')
					git pull
					;;

				*)
					>&2 echo "invalid argument ${ARG}"
					exit 1
					;;
			esac
		)

		local EXIT_CODE=$?
		if [ $EXIT_CODE != 0 ]; then
			if [ $EXIT_CODE = 255 ]; then
				return 0
			fi

			return $EXIT_CODE
		fi
	done

	# return if the above loop didn't return a bad code
	if [ -n "$*" ]; then
		return
	fi

	(
		set -euo pipefail

		readonly NOW="$EPOCHSECONDS"
		readonly FILE_PATH="${NOTES_DIR}/$(strftime '%Y/%m/%Y-%m-%d.md' "$NOW")"

		mkdir -p "$(dirname "${FILE_PATH}")"
		if ! [ -e "${FILE_PATH}" ]; then
			echo -e "# $(strftime '%a %d %b %Y' "$NOW")\n\n## todo\n\n" > "${FILE_PATH}"
		fi

		"${EDITOR}" "${EDITOR_OPTIONS[@]}" "${FILE_PATH}"
	)
}