#!/bin/sh -eu

MOINUSER=moin
test "$USER" = "$MOINUSER" || { echo "Run this command with $MOINUSER rights"; exit ; }
SHAREMOIN=/usr/share/moin
NAME="wiki"
SUPERUSER=MoinWikiAdmin
SUPASSWD=`head -c 9 /dev/urandom | base64`
DOMAINNAME=`hostname`
MOINLANGS=English
WEBGROUP=webmaster
FAVICON=""
SUEMAIL=""
LOGO=""
OPT='(^|\s)([[:upper:]]{3,})($|\s)'

pick_getopts() { # [option-veriable=opt [shellscript=$0]]
  _var=${1:-opt}
  _file=${2:-$0}
  sed -En "
  /case .$_var in/,/esac/{
    /^\s+[[:alnum:]]\) # .*$OPT/{s/\s+(.). # (.*($OPT).*)/-\1\3\t\2/p;n}
    /^\s+[[:alnum:]]\) # /s/\s+(.). # (.*)/-\1\t\2/p
  }" < "$_file"
}

getoptflags=$(pick_getopts | sed -En '
/-(.)'"$OPT"'.*/{s/-(.)'"$OPT"'.*/\1:/;H}
/-(.)\t.*/{s/-(.).*/\1/;H}
${g;s/\s//gp}
')

test "$#" = 0 && set -- -h
while getopts "$getoptflags" opt
do
  case $opt in
    n) # Wiki directory NAME
      NAME="$OPTARG";;
    u) # Generate Nginx config with space separated URLS as server_name
      # TODO port, additional path etc.
      URLS="$OPTARG"
      URLS=$(echo "$URLS" | sed 's|https?://||g')
      ;;
    t) # Wiki site TITLE
      SITENAME="$OPTARG";;
    s) # Wiki superuser NAME
      SUPERUSER="$OPTARG";;
    e) # Wiki superuser EMAIL
      SUEMAIL="$OPTARG";;
    i) # Use IMAGE as site logo
      LOGO="$OPTARG"
      LOGOEXT="${OPTARG##*.}"; LOGOEXT=${LOGOEXT-:.png}
      ;;
    f) # Use IMAGE as favicon.ico
      FAVICON="$OPTARG";;
    l) # Wiki LANGUAGE (cumulative option, default is English only)
      MOINLANGS="$MOINLANGS $OPTARG";;
    p) # Wiki superuser PASSWORD (autogenerated if not used)
      SUPASSWD="$OPTARG";;
    g) # Webmaster GROUP
      WEBGROUP="$OPTARG";;
    # TODO -f — static files path
    h|?) # Print help
      echo -e "Setup MoinMoin as uWSGI web aspplication\n\nUsage:"
      pick_getopts
      exit;;
  esac >&2
done
SUEMAIL="${SUEMAIL:-$SUPERUSER@$DOMAINNAME}"
SITEROOT=/var/www/webapps/$NAME
LANGSTORE="$SHAREMOIN/underlay/pages/LanguageSetup/attachments"
TOCOPY="config data server underlay"
MOINLANG="${MOINLANGS#* }"; MOINLANG="${MOINLANG%% *}"
SITENAME="${SITENAME:-$NAME}"
WIKICONFIG="$SITEROOT/config/wikiconfig.py"
NGINXCONF="$NAME.nginx.conf"

reconfig() { # [[where] from] to
  case "$#" in
    3) _w="$1"; _f="$2"; _t="$3";;
    2) _w="$1"; _f="$1"; _t="$2";;
    1) sed -i "\$a\    $1" "$WIKICONFIG"; return;;
    *) return;;
  esac
  sed -i "/$_w/s/$_f/$_t/" "$WIKICONFIG"
}

LANGFILE="$LANGSTORE/$MOINLANG--all_pages.zip"
if ! test -r "$LANGFILE"; then
  echo -e "No $LANGFILE\n\nLanguages avaliable:\n"
  ls "$LANGSTORE" | sed -n 's/\(.*\)--.*.zip/\1/p' | sort -u | column
  exit 1
fi >&2
LANGCODE=$(unzip -p "$LANGFILE" 42 | sed -n 's/^#language \(.*\)/\1/p')
export MOINLOGGINGCONF=$SHAREMOIN/config/logging/err

mkdir -p "$SITEROOT"/static
for DIR in $TOCOPY; do
  cp -a "$SHAREMOIN"/$DIR  "$SITEROOT/$DIR"
done
chown -R "$MOINUSER:$WEBGROUP" "$SITEROOT"

ln -sr "$SITEROOT/config/wikiconfig.py" "$SITEROOT/wikiconfig.py"

for pagefile in $SHAREMOIN/ALT/*.moin; do
  pagename=$(basename "${pagefile%.moin}")
  moin --config-dir="$SITEROOT" \
       import wikipage --page="$pagename" --file=$pagefile
done
moin --config-dir="$SITEROOT" \
     account create --name "$SUPERUSER"  --email "$SUEMAIL" --password="$SUPASSWD"

reconfig "#page_front_page = u.MyStartingPage.*" \
         "page_front_page = u'MainPage'"
reconfig "#superuser =.*YourName.*" \
         "superuser = [u'$SUPERUSER',]"
reconfig "#acl_rights_before =.*YourName.*" \
         "acl_rights_before = u'$SUPERUSER:read,write,delete,revert,admin'"
reconfig "sitename = u'.*" \
         "sitename = u'$SITENAME'"
reconfig "editor_default = ''"
reconfig "url_prefix_action = 'action'"
if [ -n "$LOGO" ]; then
  reconfig "logo_string = '<img src=\"/static/logo.$LOGOEXT\" alt=\"$SITENAME\">'"
  cp "$LOGO" "$SITEROOT/static/logo.$LOGOEXT"
fi

test -z "$LANGCODE" || reconfig "language_default = '.*" \
                                "language_default = '$LANGCODE'"

# Dangerous part
(
  cd "$SITEROOT"
  reconfig "acl_rights_before = u'$SUPERUSER:" \
           "acl_rights_before = u'All:"
  for l in $MOINLANGS; do
    python2 -m MoinMoin.packages i underlay/pages/LanguageSetup/attachments/${l}--all_pages.zip
  done
  reconfig "acl_rights_before = u'All:" \
           "acl_rights_before = u'$SUPERUSER:"
)

if [ -n "$URLS" ]; then
  cat > $SITEROOT/$NGINXCONF <<@@@
server {
  listen 80;
  listen [::]:80 ipv6only=on;
  server_name $URLS;
  location / {
    include uwsgi_params;
    uwsgi_pass unix:/run/webserver/uwsgi-$NAME.socket;
  }
  location ~ ^/moin_static[0-9]+/(.*) {
      alias /usr/share/moin/htdocs/\$1;
  }
  location ~ ^/static/(.*) {
      alias $SITEROOT/static/\$1;
  }
}
@@@
  if [ -n "$FAVICON" ]; then
    sed -i "/moin_static/i\
\ \ location ~ ^/favicon[.]ico\$ { alias $SITEROOT/static/favicon.ico; }
   " $SITEROOT/$NGINXCONF
  fi
fi

test -z "$FAVICON" || cp "$FAVICON" $SITEROOT/static/favicon.ico

SUMMARY="
Moinmoin is installed to $SITEROOT

Superuser is $SUPERUSER, password is $SUPASSWD

Edit $SITEROOT/wikiconfig.py for further configuration

Use systemctl enable --now uwsgi-py2@$NAME to start an uwsgi service
"

test -z "$URLS" || SUMMARY="$SUMMARY
Copy $SITEROOT/$NGINXCONF to /etc/nginx/sites-available.d and set up Nginx
"

echo "$SUMMARY"
