#!/bin/bash

ME=${0##*/}

PURGE_PACKAGES="live-init-antix"
W_MANAGERS="fluxbox icewm jwm"
PRETEND=

usage() {
    local ret=${1:-0}
    cat<<Usage
Usage: $me [options] install-dir
Remove live-only system to an installed system by editing some
scripts and config files.

Assume the installed system is mounted at install-dir.

Options:
    -h --help     Show this help
    -p --pretend  Don't do anything just show what would be done
    -P --PRETEND  Also show files that don't exist
Usage

    exit $ret
}

main() {

    local param
    while [ $# -gt 0 -a -n "$1" -a -z "${1##-*}" ]; do
        param=${1#-}
        shift
        case $param in
            -help|h) usage                       ;;
         -pretend|p) PRETEND=echo                ;;
         -PRETEND|P) PRETEND=echo ; VERBOSE=true ;;
                  *) error "Unknown argument: -$param" ;;
        esac
    done

    [ $# = 0 ] && usage
    [ $# = 1 ] || error "$ME requires a single command line argument"
    local IDIR=$1
    [ -z "$IDIR" ] && error "The install directory can't be empty"
    IDIR=${IDIR%/}
    if [ -z "$IDIR" ]; then
        echo "Forcing pretend mode when run on root directory"
        PRETEND=echo
    fi

    test -d $IDIR || error "$IDIR is not a directory"
    #del_line_skel xxxx ".%s/menu"

    local ds_startup=".desktop-session/startup"
    local rox_pb=".config/rox.sourceforge.net/ROX-Filer/pb_antiX-%s"

    del_line_skel "toram-eject"       $ds_startup
    del_line_skel "bootchart"          $ds_startup
    del_line_skel "minstall"          ".%s/menu"
    del_line_skel "minstall.desktop"     $rox_pb
    rm_file_skel  "Desktop/Installer"

    rm_file       etc/udev/rules.d/90-fstab-automount.rules
    rm_file       etc/*.bak 
    rm_file       etc/*-
    rm_file       lib/udev/rules.d/92-console-font.rules
    rm_file       .config/zzzfm/zzzfm_already_localized

    cp_file       /usr/share/antiX/rc.local.install etc/rc.local
    cp_file       /usr/share/antiX/issue etc/issue
    #cp_file       /usr/share/slim/themes/antiX/slim-install.conf etc/slim.conf
    cp_file       /usr/share/applications/trash.desktop etc/skel/Desktop/trash.desktop

    cp_dir        /etc/init.d/debian/init.d etc/init.d
    cp_dir        /etc/init.d/debian/runit-core etc/runit-core
    rm_dir        etc/init.d/debian

    #cp_dir        /usr/share/antiX/debian/init.d etc/init.d
    #cp_dir        /usr/share/antiX/debian/runit-core etc/runit-core
    #rm_dir        usr/share/antiX/debian


    rm_file        etc/skel/Desktop/Installer.desktop
    rm_file        usr/share/applications/minstall.desktop
    #rm_file        usr/share/applications/antixsources.desktop
    rm_file        usr/share/applications/persist-config.desktop
    rm_file        usr/share/applications/persist_setup.desktop 
    rm_file        usr/share/applications/persist_save.desktop
    rm_file        usr/share/applications/remaster.desktop

    sed_line      's/^\s*(session\s+[^\s]+\s+pam_lastlog.so).*/\1/' etc/pam.d/login

    del_line      "systemhalt_cmd" etc/slimski.local.conf
    del_line      "reboot_cmd" etc/slimski.local.conf

    #idir_chroot   dpkg --purge $PURGE_PACKAGES

    clear_dir     run tmp var/tmp
    rm_dir        var/log/live
    clear_files   var/log

}

#----------------------------------------------------------------------
# del_line <regex> <file-list>
#
# Delete all lines from <file-list> that match <regex>
#----------------------------------------------------------------------
del_line() {
    local regex=$1 file=$2
    # We are called by del_line_skel which already adds $IDIR
    [ -z "${file##/*}" ] || file=$IDIR/$file
    [ "$VERBOSE" ] || test -e "$file" || return
    $PRETEND sed -i "/$regex/d" "$file"
}

sed_line() {
    local sedex=$1 file=$2
    # We are called by del_line_skel which already adds $IDIR
    [ -z "${file##/*}" ] || file=$IDIR/$file
    [ "$VERBOSE" ] || test -e "$file" || return
    $PRETEND sed -i -r "$sedex" "$file"
}

#----------------------------------------------------------------------
# del_line_skel <regex> <file-list>
#----------------------------------------------------------------------
del_line_skel() {
    local file regex=$1 spec=$2
    while read file; do
        del_line "$regex" "$file"
    done <<Del_Line_Skel
$(skel_user_files "$spec")
Del_Line_Skel
}

rm_file_skel() {
    local file spec=$1
    while read file; do
        [ "$VERBOSE" ] || test -e "$file" || continue
        $PRETEND rm -f "$file"
    done <<Rm_File_Skel
$(skel_user_files "$spec")
Rm_File_Skel
}

backup_file() {
    local file=$IDIR/${1#/} ext=$2
    [ "$VERBOSE" ] || test -e "$file" || return
    $PRETEND mv -f "$file" "$file$ext"
}

rm_file() {
    local file
    for file; do
        file=$IDIR/${file#/}
        [ "$VERBOSE" ] || test -e "$file" || continue
        $PRETEND rm -f "$file"
    done
}

rm_dir() {
    local dir
    for dir; do
        dir=$IDIR/${dir#/}
        [ "$VERBOSE" ] || test -d "$dir" || continue
        $PRETEND rm -rf "$dir"
    done
}

cp_file() {
    local src=$1 dest=${2:-$1}
    dest=$IDIR/${dest#/}
    local dir=$(dirname $dest)
    [ "$VERBOSE" ] || test -e "$src" || return
    test -d $dir || $PRETEND mkdir -p $dir
    $PRETEND cp -af $src $dest
}

cp_dir() {
    local src=$1 dest=${2:-$1}
    dest=$IDIR/${dest#/}
    [ "$VERBOSE" ] || test -d "$src" || return
    test -d $dest || $PRETEND mkdir -p $dest
    $PRETEND cp -af $src/* $dest/ 2>/dev/null
}

clear_dir() {
    local dir full
    for dir; do
        dir=$IDIR/${dir#/}
        [ "$VERBOSE" ] || test -d "$dir" || continue
        $PRETEND find $dir -mindepth 1 -delete
    done
}

clear_files() {
    local dir full
    for dir; do
        dir=$IDIR/${dir#/}
        [ "$VERBOSE" ] || test -d "$dir" || continue
        $PRETEND find $dir -xtype f -delete
    done
}

idir_chroot() {
    $PRETEND chroot $IDIR "$@"
}

skel_user_files() {
    local spec=$1
    wm_files "$IDIR/etc/skel/$spec"
    for user in $(ls $IDIR/home 2>/dev/null); do
        dir=$IDIR/home/$user
        test -d $dir || continue
        wm_files "$dir/$spec"
    done
}

error() {
    local msg=$1  ret=${2:-2}
    echo "$ME Error: $msg" >&2
    exit $ret
}

wm_files() {
    local wm str=$1
    for wm in $W_MANAGERS; do
        printf "$str\n" $wm
    done
}

main "$@"
