#!/bin/sh

#  Copyright (c) 2026 Andrew Kloet <andrew@kloet.net>
#
#  Permission to use, copy, modify, and distribute this software for any
#  purpose with or without fee is hereby granted, provided that the above
#  copyright notice and this permission notice appear in all copies.
#
#  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
#  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
#  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
#  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
#  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
#  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

set -e # errexit

IMGDIR="${TAGPIC_IMGDIR:-$HOME/imgdir}"

usage()
{
	echo "Usage: tagpic <command> [args...]" >&2
	echo "Commands:" >&2
	echo "  i, insert   <path/to/file> [tag1 tag2 ...]" >&2
	echo "  d, delete   <filename>" >&2
	echo "  m, modify   [-a|--append] <filename> [tag1 tag2 ...]" >&2
	echo "  l, lookup   <filename>" >&2
	exit 1
}

assert_file_exists()
{
	[ -f "$1" ] || { echo "${0##*/}: File '$1' not found." >&2; exit 1; }
}

delete_symlinks()
{
	_filename="$1"
	_meta_dir="$IMGDIR/meta/$_filename"

	if [ -d "$_meta_dir" ]; then
		for _tag_link in "$_meta_dir"/*; do
			[ -L "$_tag_link" ] || continue
			_tag="${_tag_link##*/}"
			rm -f "$IMGDIR/$_tag/$_filename"
		done
		rm -rf "$_meta_dir"
	fi
}

cmd_insert()
{
	[ "$#" -lt 1 ] && usage

	_filepath="$1"
	shift

	assert_file_exists "$_filepath"
	mkdir -p "$IMGDIR/all"

	_ext="${_filepath##*.}"
	_unixtime=$(date +%s)
	_filename="${_unixtime}.${_ext}"

	cp "$_filepath" "$IMGDIR/all/$_filename"
	mkdir -p "$IMGDIR/meta/$_filename"

	for _tag do
		mkdir -p "$IMGDIR/$_tag"
		ln -s "../all/$_filename" "$IMGDIR/$_tag/$_filename"
		ln -s "$IMGDIR/$_tag" "$IMGDIR/meta/$_filename/$_tag"
	done
}

cmd_delete()
{
	[ "$#" -ne 1 ] && usage
	_filename="$1"

	assert_file_exists "$IMGDIR/all/$_filename"

	delete_symlinks "$_filename"
	rm -f "$IMGDIR/all/$_filename"
}

cmd_modify()
{
	_append=0
	if [ "$1" = "-a" ] || [ "$1" = "--append" ]; then
		_append=1
		shift
	fi

	[ "$#" -lt 1 ] && usage

	_filename="$1"
	shift

	assert_file_exists "$IMGDIR/all/$_filename"

	[ "$_append" -eq 0 ] && delete_symlinks "$_filename"
	mkdir -p "$IMGDIR/meta/$_filename"

	for _tag do
		mkdir -p "$IMGDIR/$_tag"
		ln -s "../all/$_filename" "$IMGDIR/$_tag/$_filename"
		ln -s "$IMGDIR/$_tag" "$IMGDIR/meta/$_filename/$_tag"
	done
}

cmd_lookup()
{
	[ "$#" -ne 1 ] && usage
	_filename="$1"

	assert_file_exists "$IMGDIR/all/$_filename"

	_meta_dir="$IMGDIR/meta/$_filename"
	if [ -d "$_meta_dir" ]; then
		for _tag_link in "$_meta_dir"/*; do
			[ -L "$_tag_link" ] || continue
			printf '%s\n' "${_tag_link##*/}"
		done
	fi
}

case "$1" in
	i|insert) shift; cmd_insert "$@" ;;
	d|delete) shift; cmd_delete "$@" ;;
	m|modify) shift; cmd_modify "$@" ;;
	l|lookup) shift; cmd_lookup "$@" ;;
	*) usage ;;
esac
