#!/bin/zsh

# This file is maintained at http://git.mdcc.cx/draai

# copyright:
COPYRIGHT='Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Joost van Baal-Ilić'

# This program is freely distributable per the following license:
LICENSE="
This file is part of draai.

Draai is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License, as published by the Free Software
Foundation on http://www.gnu.org/licenses/gpl.html.  You should have received
a copy of the GNU General Public License along with draai.

There is NO warranty."

PACKAGE=draai
prefix=/usr/local

typeset -a docfiles dist_docfiles man1files dist_man1files scriptfiles \
 dist_scriptfiles libexecfiles dist_libexecfiles zshfiles dist_zshfiles \
 dist_files

manhtmlfiles=(man/draai.html man/dr_symlinks.html man/dr_unsort.html \
  man/dr_watch.html)
docfiles=(COPYING ChangeLog NEWS README)
dist_docfiles=($docfiles $manhtmlfiles TODO INSTALL)

man1files=(man/draai.1 man/dr_permutate.1 man/dr_symlinks.1 \
  man/dr_unsort.1 man/dr_watch.1)
dist_man1files=($man1files man/include.zmm.in man/*.azm)

scriptfiles=(script/draai script/dr_init script/dr_permutate \
  script/dr_symlinks script/dr_unsort script/dr_watch)
dist_scriptfiles=($scriptfiles script/draai.in)

libexecfiles=(script/dr_file2tag script/dr_radio \
  script/oggsymlinks script/draai123)
dist_libexecfiles=($libexecfiles)

zshfiles=(zsh/_draai)
dist_zshfiles=($zshfiles)

dist_helpfiles=(help/{command,option,shortoption}/*)

dist_files=($dist_docfiles $dist_man1files $dist_scriptfiles \
  $dist_libexecfiles $dist_zshfiles $dist_helpfiles VERSION \
  setup man/Makefile)

dist_subdirs=(man script zsh help/{command,option,shortoption})

prog=`basename $0`

usage()
{
cat <<EOT
Usage: $prog [--prefix=PREFIX] [--libexecdir=LIBEXECDIR] install|uninstall
Install draai, or uninstall draai.

Helper scripts are by default installed in LIBEXECDIR/PACKAGE, which is
PREFIX/libexec/draai, which is /usr/local/libexec/draai by default.

(Don't run as
 $prog dist|publish|configure|changelog
unless you really know what you are doing.)
EOT
}

init()
{
    if test -f VERSION
    then
        echo reusing version $version from file VERSION
        version=$(cat VERSION)
    else
        version=$(date +%Y%m%d)
        echo creating file VERSION
        echo $version >VERSION
    fi

    { cat <<EOT
year Y
month b
day d
EOT
} | while read p o
    do
        f=stamp.$p
        if test -f $f
        then
            echo reusing file $f
        else
            echo creating file $f
            date +%$o >$f
        fi
    done

    distdir=$PACKAGE-$version
    tgz=$distdir.tar.gz
}

buildhelp()
{

# create
#  -V, --version         show program's version number and exit
#  -h, --help            show this help message and exit
#  -d, --debug           be very verbose
# from
# % cat help/option/raw/description
# Print raw stuff, suitable for postprocessing (if combined with tail, peek or
# list).
# % cat help/option/raw/option
# r
# % cat help/option/time/argument
# TIME

    cd help/option
    for f in *
    do
        # FIXME probably could better use full printf

        unset argument
        test -f "$f/argument" && argument="$( echo -n $( cat $f/argument ) )"

        # why does this not do what i think it would do?
        #  echo -n '-'
        # anyway, this behaves the way i want
        printf '  -'
        echo -n "$( cat $f/option )"
        test "$argument" && echo -n " $argument"
        echo -n ', --'
        echo -n "$f"
        test "$argument" && echo -n "=$argument"
        echo -n "\\\n"
        while read l; do echo -n "    $l\\\n"; done <$f/description
    done
    cd -

    echo -n "\\\ncommands:\\\n\\\n"

    cd help/command
    for f in *
    do
        # yes, we want a literal \n in the output: sed should be able to grok it
        echo -n "  $f:\\\n"
        while read l; do echo -n "    $l\\\n"; done <$f
        echo -n "\\\n"
    done
    cd -
}

build_cmds()
{
    cd help/command
    # create output like:
    #    draai:"play music (now or later)"
    #    init:"start a bunch of x terminals setting up some draai jobs"
    for f in *
    do
        echo -n "    $f:"'"'
        while read l; do echo -n "$l "; done < $f
        echo -n '"'"\\\n"
    done
    cd -
}

build_opts()
{
    # merge with buildhelp()?
    cd help/option
    for f in *
    do
        # '--noshuffle[do not shuffle tracks]' \
        # '--playlist[playlist file]:playlist:_draai_playlist' \
        unset argument
        test -f "$f/argument" && argument="$( echo -n $( cat $f/argument ) )"
        printf "  '--"
        echo -n "$f"'['
        # FIXME
        # test "$argument" && echo -n "[=$argument]"
        while read l; do echo -n "$l "; done <$f/description
        # make sure literal \ ends up in zsh/_draai
        # echo -n ']'"' \\\n"      just \n
        # echo -n ']'"' \\\\\\\n"  just \\n
        # yes, we need 11 \'s here...
        echo -n ']'"' \\\\\\\\\\\n"
    done
    cd -
}


configure()
{
    buildhelp >help.txt
    echo generated help.txt

    build_cmds >cmds.txt
    echo generated cmds.txt

    # '--noshuffle[do not shuffle tracks]' \
    # '--playlist[playlist file]:playlist:_draai_playlist' \
    build_opts >opts.txt
    echo generated opts.txt

    for f in script/draai.in man/include.zmm.in zsh/_draai.in
    do
       # FIXME test this
       sed "s/@VERSION@/$version/; s|@top_srcdir@|`pwd`|;
         s/@HELPTEXT@/`cat help.txt`/; s/@CMDSTEXT@/`cat cmds.txt`/;
         s|@OPTSTEXT@|`cat opts.txt`|" $f >${f%.in}
       echo generated ${f%.in} from $f
    done
    # rm help.txt cmds.txt
}

changelog()
{
    # we want no unprotected emailadresses in the cl
    git log --pretty --numstat --summary | sed 's/<[^>][^>]*>//g' | git2cl >ChangeLog
}

all()
{
    ( cd man && make )
}


OPTS=$(getopt -o h,l,p: --long help,license,prefix:,libexecdir: -- "$@")
eval set -- "$OPTS"

while true; do
    case "$1" in
      -h|--help)
        usage
        exit 0
        ;;
      -p|--prefix)
        prefix="$2"
        shift 2
        ;;
      --libexecdir)
        libexecdir="$2"
        shift 2
        ;;
      -l|--license)
        echo $COPYRIGHT
        echo $LICENSE
        exit 0
        ;;
      --)
        shift
        break
        ;;
      *)
        usage
        exit 1
        ;;
    esac
done

shift $(($OPTIND - 1))

command=$1
shift

exec_prefix=$prefix

bindir=${exec_prefix}/bin
mandir=$prefix/man
man1dir=$mandir/man1

datarootdir=$prefix/share
datadir=$datarootdir
docdir=$datadir/doc/$PACKAGE

: ${libexecdir:=${exec_prefix}/libexec}
libexecpdir=$libexecdir/$PACKAGE

zshdir=$datadir/zsh/site-functions

case $command in
  install)

    for d in $DESTDIR$bindir $DESTDIR$man1dir $DESTDIR$docdir $DESTDIR$libexecpdir $DESTDIR$zshdir
    do
        test -d "$d" || { mkdir -p "$d" && echo created $d }
    done
    for p in $scriptfiles
    do
        if test -f $p
        then
            install -c "$p" "$DESTDIR$bindir/$(basename $p)" && \
              echo installed $DESTDIR$bindir/$(basename $p)
        fi
    done
    for p in $man1files
    do
        if test -f $p
        then
            install -c -m 644 "$p" "$DESTDIR$man1dir/$(basename $p)" && \
              echo installed $DESTDIR$man1dir/$(basename $p)
        fi
    done
    for p in $docfiles
    do
        if test -f $p
        then
            install -c -m 644 "$p" "$DESTDIR$docdir/$(basename $p)" && \
              echo installed $DESTDIR$docdir/$(basename $p)
        fi
    done
    for p in $libexecfiles
    do
        if test -f $p
        then
            install -c "$p" "$DESTDIR$libexecpdir/$(basename $p)" && \
              echo installed $DESTDIR$libexecpdir/$(basename $p)
        fi
    done
    for p in $zshfiles
    do
        if test -f $p
        then
            install -c -m 644 "$p" "$DESTDIR$zshdir/$(basename $p)" && \
              echo installed $DESTDIR$zshdir/$(basename $p)
        fi
    done

    ;;
  uninstall)
    # FIXME
    echo not yet implemented
    ;;
  dist)

    cp /usr/share/common-licenses/GPL COPYING

    init
    echo $version >VERSION

    configure
    changelog
    all

    if head NEWS | grep -q $version
    then
        :
    else
        echo error: NEWS does not mention release $version
        exit 1
    fi

    rm -rf $distdir
    mkdir $distdir
    for dir in $dist_subdirs
    do
        mkdir -p $distdir/$dir
    done

    for file in $dist_files
    do
        dir=$(echo "$file" | sed -e 's,/[^/]*$,,')
        cp -pR $file $distdir/$dir
    done

    tar chof - $distdir | gzip -c >$distdir.tar.gz

    ls -l $distdir.tar.gz
    ;;
  publish)
    init
    scp $tgz beskar.mdcc.cx:www/mdcc.cx/pub/draai/
    ;;

# sign: for i in $(DIST_ARCHIVES); do echo "gpg --armor --detach-sign $$i"; gpg --armor --detach-sign $$i; done
#
# publish: for i in $(DIST_ARCHIVES); do echo "scp $$i $$i.asc $(MY_RDIR)"; scp $$i $$i.asc $(MY_RDIR); done
#        @echo now run: ssh beskar update-tar-symlinks uruk
#        @echo '( or: ssh beskar.mdcc.cx ./bin/update-tar-symlinks uruk )'


  configure)
    # not for users, merely convenience for developers
    init
    configure
    ;;
  changelog)
    changelog
    ;;
  *)
    usage
    exit 1
    ;;
esac