#!/usr/bin/bash

PATH=.:$(dirname $0):/usr/lib/magicos/scripts:$PATH
. liblinuxlive || exit 1

zcat /proc/config.gz | grep -q SQUASHFS_XZ && MODULEFORMAT=xzm || MODULEFORMAT=lzm

function makename()
{
  rootname="$nn-$(basename $dirname)-$(cat /mnt/live/VERSION | awk '{ print $1 }')-$user-$date"
  modname="$DESTDIR/$rootname.$MODULEFORMAT"
}

function makedoc()
{
   mkdir -p "$dirname/usr/share/doc/modules/"
   if [ -f "$doc" ] ; then
      cat "$doc" > "$dirname/usr/share/doc/modules/$rootname"
   else
      echo "$doc" >  "$dirname/usr/share/doc/modules/$rootname"
   fi
}

function makelocaldoc()
{
   mkdir -p "$dirname/usr/share/doc/modules/"
   if [ -f "$localdoc" ] ; then
      cat "$localdoc" >  "$dirname/usr/share/doc/modules/$rootname.$LANG"
   else
      echo "$localdoc" >  "$dirname/usr/share/doc/modules/$rootname.$LANG"
   fi
}

function updateDocDate() 
{
   for file in $(ls -1 "$dirname"/usr/share/doc/modules/ ) ; do
      mv -f "$dirname/usr/share/doc/modules/$file" "$dirname/usr/share/doc/modules/$rootname"$(echo $file | awk -F. /UTF/'{print "."$(NF-1)"."$NF}') > /dev/null 2>&1    # '
   done
}

function updateRPMDate()
{
   mv -fT $(ls "$dirname"/var/lib/rpm/modules/*)  "$dirname/var/lib/rpm/modules/$rootname" >/dev/null 2>&1
}

function help()
{
   cat <<EOF
$0 - compress dir to MagicOS $MODULEFORMAT module
Usage: $0 [args] [dirname] [file.$MODULEFORMAT]

Args:
  -d <doc>         Add base english documentation (text or file name)
  -l <localDoc>    Add documentation in current locale \$LANG (text or file name)
  -u <user>        module's author nickname
  -n <NN>          First number in module name
  -s <simulate>    Do not create module, but execute all other tasks. Use it if you need to create/update doc files.
  -o <dest_dir>    Destination directory
  -h <help>        This help
  -i <interactive> Interactive	
Examples:
$0 ./newmodule
	Compress ./newmodule dir to $MODULEFORMAT module, update date in doc files (only if exists), generate modulename automatically
$0 ./newmodule ./123.$MODULEFORMAT
	Compress ./newmodule dir to 123.$MODULEFORMAT, update date in doc files (only if exists)
$0 -d new_module_description.txt -l new_module_description_ru.txt -u besthaker -n 90
	Compress ./newmodule dir to $MODULEFORMAT module, create doc files, generate modulename automatically,
	with firstnumber 90, nikname - besthaker and current date.
$0 -s -d ./doc.txt ./newmodule
	Copy text from ./doc.txt to module doc file, generate modulename, show command to make module,
	but do not execute it.
$0 -u besthacker -i ./newmodule
	Compress ./newmodule dir to $MODULEFORMAT module, with nikname besthacker and asks other interactive
EOF
}

function interactive () {
if [ -z $user ] ; then
	echo "Enter maintainer name, please"
	user=$(xuserrun whoami)
        echo "Current is \"$user \""
        read a
	[ -z $a ] || user=$a
fi
if [ -z $nn ] ; then 	
	echo "0x - kernel modules"
	echo "1x - cli utilites and daemons"
	echo "2x - graphics and multimedia libs, utilites"
	echo "3x - DE, WM"
	echo "4x - progravs with GUI"
	echo "7x - modules for programs"
	echo "8x - i18"
	echo "9x - patches"
	echo "x0 - libs"
	echo "x1-8 - utils"
	echo "x9 - patches"
	echo "Enter first namber for module, please"
read b
[ -z $b ] || nn=$b
fi

if [ -z $DESTDIR ] ; then 
	echo "Enter DESTDIR, please. Default is \"./\""
	read c
[ -z $c ] || DESTDIR=$c
fi

if [ -z "$doc" ] ; then 
echo "Enter simple module doc in english"
read d
[ -z "$d" ] || doc="$d"
fi

if [ -z "$localdoc" ] ; then
echo "Enter simple module doc in your locale"
read e
[ -z "$e" ] || localdoc="$e"
fi
}



while getopts shu:d:l:n:o:i option ;do
    case $option in
      "h" )
	  help && exit
          ;;
      "u")
	  user=$OPTARG
          ;;
      "d")
	  doc=$OPTARG
          ;;
      "l")
	  localdoc=$OPTARG
          ;;
      "n")
	  nn=$OPTARG
          ;;
      "s")
	  s=simulate
          ;;
      "o")
	  DESTDIR=$OPTARG
          ;;
      "i" )
	  interactive
     	  ;;
    esac
done
shift $((OPTIND - 1))
date=$(date +%Y%m%d)
dirname="$1"
[ -z "$nn" ] && nn=NN
[ -z "$user" ] && user=$(xuserrun whoami)
[ -z "$dirname" ] && help && exit 1
[ -z "$DESTDIR" ] && DESTDIR=./

if [ ! -d "$DESTDIR" -o ! -w "$DESTDIR" ]; then 
   echo "Can't write to directory $DESTDIR"
   exit 1
fi

if [ $# -eq 1 ] ; then 
   makename
else
   modname="$2"
   rootname=${modname%.*}
   rootname=${rootname##*/}
fi

ls "$dirname"/usr/share/doc/modules/*  >/dev/null 2>&1 && updateDocDate
ls "$dirname"/var/lib/rpm/modules/* >/dev/null 2>&1 && updateRPMDate
[ -z "$doc" ] || makedoc
[ -z "$localdoc" ] || makelocaldoc

if [ "_$s" == "_simulate" ] ; then
   echo "Exec: create_module "$1" "$modname""
else
   create_module "$1" "$modname"
fi
if [ $? != 0 ]; then 
   echo "Error building compressed image"
   exit 1
fi
