#!/usr/bin/bash

# Cleanup
set -e
trap 'exit 1' SIGINT

# Constants
VERSION=2.0.1
template_dir="$HOME/Templates"
fd_opts=(--type f --threads "$(nproc)")

# Helper functions
function help() {
    cat << HELPMESSAGE
$(basename "$0") $VERSION

Usage: $(basename "$0") [-h] [-d DIR] [-f] dest

Positional arguments:
  dest

options:
  -h, --help            show this help message and exit
  -d DIR, --template-dir DIR
                        choose a template directory (default: ~/Templates)
  -f, --force           overwrite dest if it exists
HELPMESSAGE
}

while true; do
    case "${1}" in
        '-d' | '--dir')
            template_dir="${2}"
            case "${template_dir}" in
                "")
                    exit 1
                    ;;
                -*)
                    exit 1
                    ;;
            esac
            shift 2
            continue
            ;;
        --dir=*)
            template_dir="${1#*=}"
            case "${template_dir}" in
                "")
                    exit 1
                    ;;
                -*)
                    exit 1
                    ;;
            esac
            shift
            continue
            ;;
        '-f' | '--force')
            FORCE_OVERWRITE='--force'
            shift
            continue
            ;;
        '-h' | '--help')
            help
            exit
            ;;
        --)
            shift
            break
            ;;
        -*)
            printf '%s\n' "Unknown option: ${1}" >&2
            exit 1
            ;;
        *)
            break
            ;;
    esac
done

# If no target specified
if [[ -z "$1" ]]; then
    help
    exit 1
fi

# Check if template directory exists
if ! [[ -d "$template_dir" ]]; then
    printf '%s\n' "Template directory doesn't exist, exiting."
    exit 2
fi

files="$(fd "${fd_opts[@]}" -- . "$template_dir")"
selected_file="$(fzf --select-1 --exit-0 <<< "$files")"

# Check if target exists
if [[ -f "$1" && -z "$FORCE_OVERWRITE" ]]; then
    printf '%s\n' 'File already exists, exiting'
    exit 1
elif [[ -f "$1" && -n "$FORCE_OVERWRITE" ]]; then
    cp --verbose --force -- "$selected_file" "$1"
else
    cp --verbose -- "$selected_file" "$1"
fi