#!/usr/bin/env bash

# This file contains functions relating to file operations such as new, edit and deleting files

newFile(){
	vecho "newFile $*"
	cd "$dataDir" || return
	# While there is a - at the begining
	local title="$*"
	if [ -z "$title" ]; then
		echo -n "Enter a title: "
		read -r title
	fi
	local filename
	filename="$(escapeFilename "$title.md")"
	[ -e "$filename" ] && die "$filename already exists"
	echo -e "---
Title: $title
Tags:
	-
---
" > "$filename"
	editFile "$filename"
}

# Takes the filename as a parameter
editFile(){
	vecho "editFile $*"
	cd "$dataDir" || return
	local filename
	filename="$(findFile "$*")"
	[ ! -e "$filename" ] && exit 1
	"$editor" "$filename"
	updateFileChange "$filename"
}

# This is used to update the DB when a file is changed
# param1 is the file
updateFileChange(){
	local filename
	local title
	local newFilename
	filename="$(findFile "$1")"
	[ ! -e "$filename" ] && die "No such file $1"
	title="$(getYamlTitle "$filename")"
	newFilename="$(escapeFilename "$title.md")"
	if [ "$filename" = "$newFilename" ]; then
		# The title hasn't changed
		# check if the file is in the DB
		if ! fileInDB "$filename"; then
			# If not, add it
			echo "INSERT INTO items (filename, title, type)
			VALUES ( '$(safeSQL "$filename")',
				'$(safeSQL "$title")', 'normal' );" |
			sqlite3 "${sqliteFile}"
		fi
		# Make sure all the tags are up to date
		getYamlTags "$filename" | assignTags "$filename"
		gitChange "$filename"
	else
		# The title has changed so we need to move the file
		if [ -e "$newFilename" ]; then
			# If the place we need to move it to already exists, die
			die -e "$newFilename already exists
$filename title changed
Please resolve manually"
		else
			mv "$filename" "$newFilename"
			if fileInDB "$filename"; then
				echo "UPDATE items
					SET (filename,title) =
					('$(safeSQL "$newFilename")','$(safeSQL "$title")')
					WHERE filename = '$(safeSQL "$filename")';" |
					sqlite3 "${sqliteFile}"
			else
				# We get here if the title was changed in the create process
				echo "INSERT INTO items (filename, title, type)
					VALUES ( '$(safeSQL "$newFilename")',
					'$(safeSQL "$title")', 'normal' );" |
				sqlite3 "${sqliteFile}"

			fi
			gitChange "$filename" "$newFilename"
		fi
	fi
}

deleteFile(){
	cd "$dataDir" || return
	local filename
	local fileID
	local rsp
	filename="$(findFile "$1")"
	fileID="$(findFileId "$filename")"
	[ ! -e "$filename" ] && exit 1
	echo -n "Are you sure? [yN] "
	read -r rsp
	if [[ "$(echo "$rsp" | tr '[:upper:]' '[:lower:]')" = "y"* ]]; then
		rm "$filename"
		# This deletes the file from the sql database and any tag links
		echo "DELETE FROM items
			WHERE id = '$(safeSQL "$fileID")';
			DELETE FROM links
			WHERE itemID = '$(safeSQL "$fileID")';" |
			sqlite3 --column --header "${sqliteFile}"
		gitChange "$filename"
	fi
}

viewFile(){
	cd "$dataDir" || return

	local id="$1"
	local filename

	filename="$(findFile "$id")"

	"$pager" "$filename"
}