#!/usr/bin/env bash

# Note taking tool
#
# Usage:
#   note [name]              - Create a new note with optional name (defaults to "New note")
#   note -e|--edit [name]    - Edit an existing note by name
#
# Arguments explanation:
#   [name]                   - Note filename (without extension) and title
#   -e, --edit [name]        - Edit existing note by name
#
# Detailed usage:
#   note                         - Creates "New note" with current timestamp
#   note my-idea                 - Creates note titled "my-idea"
#   note my-idea "My Great Idea" - Creates note file "my-idea" but titled "My Great Idea"
#   note -e my-idea              - Edits existing note with name "my-idea"
#
# Notes are stored as markdown files in ~/notes/ with timestamps
# When multiple notes have the same name, you'll be prompted to select which one to edit

arg1="$1"
arg2="$2"
path="$HOME/notes"
[[ ! -d "$path" ]] && mkdir -p "$path"

shopt -s nullglob
files=("$path"/*.md)
shopt -u nullglob

case "$arg1" in
    -e|--edit)
        [[ -z "$arg2" ]] && {
            echo "Note name is required"
            exit 1
        }

        # shellcheck disable=SC2207
        found=($(echo "${files[@]}" | grep -P "[0-9]{10}-$arg2.md"))
        [[ ${#found[@]} -eq 0 ]] && {
            echo "Note with name '$arg2' not found."
            echo "Create it with using 'note $arg2'"
            exit
        }

        [[ ${#found[@]} -eq 1 ]] && {
            nano "${found[0]}"
            exit
        }

        PS3="Select a note to edit: "
        select selection in "${found[@]}" "Exit"; do
            [[ "$selection" == "Exit" ]] && exit
            [[ -f "$selection" ]] && {
                nano "$selection"
                exit
            }
            continue
        done
        ;;

    *)
        [[ -z "$arg2" ]] && arg2="${arg1:-New note}"
        file="$path/$(date +%s)-$arg1.md"
        cat <<EOF > "$file"
# $arg2

Note taken: $(date '+%d.%m.%Y %H:%M:%S')

EOF
        nano "$file"
        ;;
esac
