#!/bin/bash

set -euo pipefail

RECORDUM_USER="recordum"
DEFAULT_RECORDUM_HOME="/var/home/recordum"
RECORDUM_SYSTEM_HOME="/usr/local/recordum"
VI_BIN="/usr/bin/vi"

# @brief Resolve the recordum user's home directory.
resolve_recordum_home_dir() {
    local home_dir=""

    if getent passwd "${RECORDUM_USER}" >/dev/null 2>&1; then
        home_dir="$(getent passwd "${RECORDUM_USER}" | cut -d: -f6)"
    fi

    if [ -z "${home_dir}" ]; then
        home_dir="${DEFAULT_RECORDUM_HOME}"
    fi

    printf '%s\n' "${home_dir}"
}

# @brief Resolve the directory boundaries used to authorize edits.
ALLOWED_BASE_DIRS=()

RECORDUM_HOME_DIR="$(resolve_recordum_home_dir)"
if [ -d "${RECORDUM_HOME_DIR}" ]; then
    RECORDUM_HOME_DIR="$(readlink -e -- "${RECORDUM_HOME_DIR}" 2>/dev/null || printf '%s' "${RECORDUM_HOME_DIR}")"
fi
ALLOWED_BASE_DIRS+=("${RECORDUM_HOME_DIR}")

if [ -d "${RECORDUM_SYSTEM_HOME}" ]; then
    RECORDUM_SYSTEM_HOME="$(readlink -e -- "${RECORDUM_SYSTEM_HOME}" 2>/dev/null || printf '%s' "${RECORDUM_SYSTEM_HOME}")"
fi
ALLOWED_BASE_DIRS+=("${RECORDUM_SYSTEM_HOME}")

# @brief Print a consistent wrapper error and terminate.
die() {
    printf 'recordum_edit: %s\n' "$*" >&2
    exit 1
}

# @brief Validate that a requested edit target resolves inside an allowed base directory.
validate_recordum_file() {
    local candidate="$1"
    local resolved=""
    local base_dir=""
    local allowed="false"

    resolved="$(readlink -e -- "$candidate" 2>/dev/null || true)"
    if [ -z "${resolved}" ]; then
        die "'${candidate}' does not exist"
    fi

    for base_dir in "${ALLOWED_BASE_DIRS[@]}"; do
        case "${resolved}" in
            "${base_dir}"/*)
                allowed="true"
                break
                ;;
        esac
    done

    if [ "${allowed}" != "true" ]; then
        die "'${candidate}' resolves outside allowed bases (${ALLOWED_BASE_DIRS[*]}): ${resolved}"
    fi

    if [ ! -f "${resolved}" ]; then
        die "'${candidate}' is not a regular file"
    fi
}

if [ ! -x "${VI_BIN}" ]; then
    VI_BIN="$(command -v vi || true)"
fi

if [ -z "${VI_BIN}" ]; then
    die "vi is not installed"
fi

if [ ! -x "${VI_BIN}" ]; then
    die "vi is not executable at ${VI_BIN}"
fi

declare -a VI_OPTIONS=()
declare -a VI_FILES=()

while [ "$#" -gt 0 ]; do
    case "$1" in
        --)
            shift
            while [ "$#" -gt 0 ]; do
                validate_recordum_file "$1"
                VI_FILES+=("$1")
                shift
            done
            ;;
        -c|-t|-u|-U|-i|-S|-T|-w|-W|-s)
            opt="$1"
            shift
            [ "$#" -gt 0 ] || die "option '${opt}' requires an argument"
            VI_OPTIONS+=("${opt}" "$1")
            shift
            ;;
        -o|-O|-p)
            opt="$1"
            shift
            VI_OPTIONS+=("${opt}")
            if [ "$#" -gt 0 ] && [[ "$1" =~ ^[0-9]+$ ]]; then
                VI_OPTIONS+=("$1")
                shift
            fi
            ;;
        +*)
            VI_OPTIONS+=("$1")
            shift
            ;;
        -*)
            VI_OPTIONS+=("$1")
            shift
            ;;
        *)
            validate_recordum_file "$1"
            VI_FILES+=("$1")
            shift
            ;;
    esac
done

cmd=("${VI_BIN}")

if [ "${#VI_OPTIONS[@]}" -gt 0 ]; then
    cmd+=("${VI_OPTIONS[@]}")
fi

if [ "${#VI_FILES[@]}" -gt 0 ]; then
    cmd+=(-- "${VI_FILES[@]}")
fi

exec "${cmd[@]}"
