# Save file checksums.
# For file with a name `file` it will create a new file called `.file.sha1` with hash in it.
# All files by default.
# Usage: checksum_create [FILES]
function checksum_create() {
	local IFS=$'\n'
	local targets=(${@})
	[[ "${targets}" = "" ]] && targets=($(_ls_file))

	process() {
		local hashfile=".${target#./}.sha1"

		# Skip if hash exists.
		[[ -f "${hashfile}" ]] && return 0

		# Calculate hash.
		pv ${target} | sha1sum > ${hashfile}
	}

	_iterate_targets process ${targets[@]}
}

# Check stored values against actual files.
# All files by default.
# Usage: checksum_check [FILES]
function checksum_check() {
	local IFS=$'\n'
	local targets=(${@})
	[[ "${targets}" = "" ]] && targets=($(_ls_file))

	process() {
		local hashfile=".${target#./}.sha1"

		# Skip if hash doesn't exist.
		[[ -f "${hashfile}" ]] || { _iterate_skip "No hash found."; return 0; }

		# Calculate hash.
		local stored=$(cat "${hashfile}" | cut -d\  -f1)
		local actual=$(pv "${target}" | sha1sum | cut -d\  -f1)

		if [[ "${stored}" != "${actual}" ]]; then
			_error "Failed."
			return 1
		fi
	}

	_iterate_targets process ${targets[@]}
}

# Calculate hashes for all files recursively and store in a file called `checksum.sha1`.
function checksum() {
	find -type f | parallel -j $(_core_count) -- sha1sum {} >> checksum.sha1
}

# Create checksum for a file.
# Usage: _checksum_create <FILE>
function _checksum_create() {
	local path="${1%/*}"
	local name="${1##*/}"
	sha1sum "${path}/${name}" > "${path}/.${name}.sha1"
}

# Check checksum for a file.
# Usage: _checksum_check <FILE>
function _checksum_check() {
	local file="${1##*\ \ }"
	local stored="${1%%\ \ *}"

	# Skip if no file.
	[[ -f "${file}" ]] || return 0

	# Check file hash.
	local actual=$(sha1sum "${file}")
	actual="${actual%%\ \ *}"

	# Compare values.
	if [[ "${stored}" != "${actual}" ]]; then
		_error "${file}: Failed."
		return 1
	fi

	return 0
}