#!/bin/sh

# Start Vim on a copy of the tutor file.

# Type "man vimtutor" (or "vimtutor --help") to learn more about the supported
# command-line options.
#
# Tutors in several human languages are distributed.  Type "vimtutor" to use
# a tutor in the language of the current locale (:help v:lang), if available;
# otherwise fall back to using the English tutor.  To request any bundled
# tutor, specify its ISO639 name as an argument, e.g. "vimtutor nl".

# Vim could be called "vim" or "vi".  Also check for "vimN", for people who
# have Vim installed with its version number.
seq="vim vim91 vim90 vim81 vim80 vim8 vim74 vim73 vim72 vim71 vim70 vim7 vim6 vi"

usage()
{
    echo "==USAGE========================================================================================="
    echo "${0##*/} [[-(-l)anguage] ISO639] [-(-c)hapter NUMBER] [-(-g)ui] | [-(-h)elp] | [--list]"
    printf "\twhere:\n"
    printf "\t\tISO639 (default=en) is a 2 or 3 character language code\n"
    printf "\t\tNUMBER (default=1) is a chapter number (1 or 2)\n"
    printf "\texamples:\n"
    printf "\t\tvimtutor -l es -c 2 -g\n"
    printf "\t\tvimtutor --language de --chapter 2\n"
    printf "\t\tvimtutor fr\n"
    echo "More information at 'man vimtutor'"
    echo "================================================================================================"
}

listOptions()
{
    echo "==OPTIONS======================================================================================="
    echo "Chapter: 1"
    printf "\tLang: %-3s => %s\n" \
bar Bavarian \
bg Bulgarian \
ca Catalan \
cs Czech \
da Danish \
de German \
el Greek \
en English\(default\) \
eo Esperanto \
es Spanish \
fr French \
hr Croatian \
hu Hungarian \
it Italian \
ja Japanese \
ko Korean \
lt Lithuanian \
lv Latvian \
nb Bokmål \
nl Dutch \
no Norwegian \
pl Polish \
pt Portuguese \
ru Russian \
sk Slovak \
sr Serbian \
sv Swedish \
tr Turkish \
uk Ukrainian \
vi Vietnamese \
zh Chinese

    echo "Chapter: 2"
    printf "\tLang: %-3s => %s\n" \
en English\(default\)
    echo "================================================================================================"
}

validateLang()
{
    case "$xx" in
	'' | *[!a-z]* )
	    echo "Error: iso639 code must contain only [a-z]"
	    exit 1
    esac

    case "${#xx}" in
	[23] )
	    ;;
	* )
	    echo "Error: iso639 code must be 2 or 3 characters only"
	    exit 1
    esac

    export xx
}

validateChapter()
{
    case "$cc" in
	'' | *[!0-9]* )
	    echo "Error: chapter argument must contain digits only"
	    exit 1
	    ;;
	[12] )
	    ;;
	* )
	    echo "Error: invalid chapter number: [12]"
	    exit 1
    esac

    export CHAPTER="$cc"
}

while [ "$1" != "" ]; do
    case "$1" in
	-g | --gui )
	    seq="gvim gvim91 gvim90 gvim81 gvim80 gvim8 gvim74 gvim73 gvim72 gvim71 gvim70 gvim7 gvim6 $seq"
	    ;;
	-l | --language )
	    shift
	    xx="$1"
	    validateLang
	    ;;
	-l[a-z][a-z][a-z] | -l[a-z][a-z] )
	    export xx="${1#*l}"
	    ;;
	--language[a-z][a-z][a-z] | --language[a-z][a-z] )
	    export xx="${1#*e}"
	    ;;
	[a-z][a-z][a-z] | [a-z][a-z] )
	    export xx="$1"
	    ;;
	-c | --chapter )
	    shift
	    cc="$1"
	    validateChapter
	    ;;
	-c[12] )
	    export CHAPTER="${1#*c}"
	    ;;
	--chapter[12] )
	    export CHAPTER="${1#*r}"
	    ;;
	-h | --help )
	    usage
	    exit
	    ;;
	--list )
	    listOptions
	    exit
	    ;;
	"" )
	    ;;
	* )
	    usage
	    exit 1
    esac

    shift
done


# We need a temp file for the copy.  First try using a standard command.
tmp="${TMPDIR-/tmp}"
# shellcheck disable=SC2186
TUTORCOPY=$(mktemp "$tmp/tutorXXXXXX" || tempfile -p tutor || echo none)

# If the standard commands failed then create a directory to put the copy in.
# That is a secure way to make a temp file.
if test "$TUTORCOPY" = none; then
    tmpdir="$tmp/vimtutor$$"
    OLD_UMASK=$(umask)
    umask 077
    getout=no
    mkdir "$tmpdir" || getout=yes
    umask "$OLD_UMASK"
    if test "$getout" = yes; then
	echo "Could not create directory for tutor copy, exiting."
	exit 1
    fi
    TUTORCOPY="$tmpdir/tutorcopy"
    touch "$TUTORCOPY"
    TODELETE="$tmpdir"
else
    TODELETE="$TUTORCOPY"
fi

export TUTORCOPY

# remove the copy of the tutor on exit
trap 'rm -rf "$TODELETE"' EXIT HUP INT QUIT SEGV PIPE TERM

for i in $seq; do
    testvim=$(command -v "$i" 2>/dev/null)
    if test -f "$testvim"; then
	VIM="$i"
	break
    fi
done

# When no Vim version was found fall back to "vim", you'll get an error message
# below.
if test -z "$VIM"; then
    VIM=vim
fi

# Use Vim to copy the tutor, it knows the value of $VIMRUNTIME
# The script tutor.vim tells Vim which file to copy

$VIM -f -u NONE -c "so \$VIMRUNTIME/tutor/tutor.vim"

# Start vim without any .vimrc, set 'nocompatible' and 'showcmd'
$VIM -f -u NONE -c "set nocp showcmd" "$TUTORCOPY"

# vim:sw=4:ts=8:noet:nosta:
