#!/bin/sh

# Start Vim on a copy of the tutor file.

# Usage: vimtutor [-g] [xx]
# Where optional argument -g starts vimtutor in gvim (GUI) instead of vim.
# and xx is a language code like "es" or "nl".
# When an argument is given, it tries loading that tutor.
# When this fails or no argument was given, it tries using 'v:lang'
# When that also fails, it uses the English version.

# 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=01) is one or two digits representing the chapter number\n"
    printf "\texamples:\n"
    printf "\t\tvimtutor -l es -c 2 -g\n"
    printf "\t\tvimtutor --language de --chapter 02\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 \
lv Latvian \
nb Bokmål \
nl Dutch \
no Norwegian \
pl Polish \
pt Portuguese \
ru Russian \
sk Slovak \
sr Serbian \
sv Swedish \
tr Turkish \
uk English \
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
      ;;
    0 | 00 )
      echo "Error: chapter must be non-zero"
      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[1-9][0-9] | -c[1-9] )        export CHAPTER="${1#*c}"
                                    ;;
    --chapter[1-9][0-9] | --chapter[1-9] )
                                    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}"
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"
