#shellcheck shell=dash

___x_cmd_githook_find_folder_(){
    local TGT_FOLDER="$1"
    local cur="$PWD"

    while [ ! "$cur" = "" ]; do
        if [ -d "$cur/$TGT_FOLDER" ]; then
            ___X_CMD_GITHOOK_FIND_FOLDER_="$cur"
            return 0
        fi
        cur=${cur%/*}
    done
    return 1
}

___x_cmd_githook___x_cmd_inner_cd(){
    if [ -n "$ZSH_VERSION" ]; then
        builtin cd "$@" || return
    else
        command cd "$@" || return
    fi
}

___x_cmd_githook_find_folder_ .x-cmd
___X_CMD_GITHOOK_WSROOT="$___X_CMD_GITHOOK_FIND_FOLDER_"

if [ ! -f "$___X_CMD_GITHOOK_WSROOT/.x-cmd/git/hook.yml" ] && [ ! -d "$___X_CMD_GITHOOK_WSROOT/.x-cmd/git/hook" ]; then
    return 0
fi

if [ -n "$GIT_DIR" ]; then
    ___x_cmd_githook___x_cmd_inner_cd "$GIT_DIR" || return
    ___X_CMD_GITHOOK_GIT_DIR="$PWD"
    ___x_cmd_githook___x_cmd_inner_cd "$OLDPWD" || return
else
    ___x_cmd_githook_find_folder_ .git
    ___X_CMD_GITHOOK_GIT_DIR="${___X_CMD_GITHOOK_FIND_FOLDER_}/.git"
fi

___X_CMD_GITHOOK_CACHE_DIR="${___X_CMD_GITHOOK_GIT_DIR}/.x-cmd/hooks/${___X_CMD_GITHOOK_VERSION}"

# Using not -ot for the case when DONE file is absent.
[ "$PWD/.x-cmd/git/hook.yml" -ot "${___X_CMD_GITHOOK_CACHE_DIR}/DONE.APPLY.GITHOOK.X-CMD.COM" ] || (
    . "$HOME/.x-cmd.root/X"
    x log :githook -c "$PWD/.x-cmd/git/hook.yml"    \
        --cache "$___X_CMD_GITHOOK_CACHE_DIR"       \
        --hook "$___X_CMD_GITHOOK_HOOKNAME"         \
        "Apply githook for file modification detected"
    x githook apply "$PWD/.x-cmd/git/hook.yml" "${___X_CMD_GITHOOK_GIT_DIR}/.x-cmd/hooks/${___X_CMD_GITHOOK_VERSION}"
) # Notice: The x-cmd loaded in 'githook apply' MUST be kept in the subshell. So it CANNOT affect the behavior of loading specific x-cmd in user-defined scripts.

___X_CMD_GITHOOK_CACHHOOKFP="${___X_CMD_GITHOOK_CACHE_DIR}/${___X_CMD_GITHOOK_HOOKNAME}"
if [ -f "${___X_CMD_GITHOOK_CACHHOOKFP}" ]; then
    . "${___X_CMD_GITHOOK_CACHHOOKFP}"
fi

if [ -f "$___X_CMD_GITHOOK_WSROOT/.x-cmd/git/hook/${___X_CMD_GITHOOK_HOOKNAME}" ]; then
    . "$___X_CMD_GITHOOK_WSROOT/.x-cmd/git/hook/${___X_CMD_GITHOOK_HOOKNAME}"
fi
