#!/bin/bash

       DARK_ICONS="Faenza-Cupertino-mini"
   DARK_GTK_THEME="MediterraneanGrayDark"
  DARK_FLUX_THEME="usr/share/fluxbox/styles/antiX"
 DARK_ICEWM_THEME="icegil-remix/default.theme"

      LIGHT_ICONS="BRIT-ICONS"
  LIGHT_GTK_THEME="MediterraneanWhite"
 LIGHT_FLUX_THEME="/usr/share/fluxbox/styles/Radiant-antiX"
LIGHT_ICEWM_THEME="IceClearlooks/default.theme"

ROX_DIR=".config/rox.sourceforge.net/ROX-Filer"


ME=${0##*/}
DIR=$HOME
PRETEND=
VERBOSE=
NO_RESTART=

usage() {
    local ret=${1:-0}
    cat <<Usage
Usage: $ME [options] <light|dark>

Set the desktop theme to either light or dark.

Options:
    -d --dir=<dir>   Modify files under <dir> instead of HOME
    -h --help        Show this help
    -n --no-restart  Don't restart the window manager
    -p --pretend     Show the changes instead of doing theme
    -v --verbose     Show the changes and do them
Usage

    exit $ret
}

main() {

    [ $# -eq 0 ] && usage

    local arg val="unknown"
    while [ $# -gt 0 -a -n "$1" -a -z "${1##-*}" ]; do
        arg=${1#-}
        shift

        case $arg in
            -dir|[d])
                [ $# -lt 1 ] && fatal "Expected a parameter after: -$arg"
                val=$1
                [ -n "$val" -a -z "${val##-*}" ] \
                    && fatal "Suspicious argument after -$arg: $val"
                shift           ;;

            *=*) val=${arg#*=} ;;
            *)   val="unknown" ;;
        esac

        case $arg in
             -dir|d) DIR=$val                        ;;
            -help|h) usage                           ;;
      -no-restart|n) NO_RESTART=true                 ;;
         -pretend|p) PRETEND=echo                    ;;
         -verbose|v) VERBOSE=true                    ;;
                  *) error "Unknown argument: -$arg" ;;
        esac
    done

    [ $# -eq 1 ] || fatal "Expected a single command line argument"

    local theme=$1
    case $theme in
         dark)  ICONS=$DARK_ICONS
                GTK_THEME=$DARK_GTK_THEME
                FLUX_THEME=$DARK_FLUX_THEME
                ICEWM_THEME=$DARK_ICEWM_THEME ;;

        light)  ICONS=$LIGHT_ICONS
                GTK_THEME=$LIGHT_GTK_THEME
                FLUX_THEME=$LIGHT_FLUX_THEME
                ICEWM_THEME=$LIGHT_ICEWM_THEME ;;

            *)  fatal "Unrecognized theme: $theme" ;;
    esac

    replace_line "s|^\s*(Theme=\")[^\"]*(\").*|\1$ICEWM_THEME\2|"                   .icewm/theme
    replace_line "s|^\s*(session.styleFile:\s+).*|\1$FLUX_THEME|"                   .fluxbox/init
    replace_line "s|^(\s*<Option name=\"icon_theme\">)[^<]*(</Option>)|\1$ICONS\2|" $ROX_DIR/Options
    replace_line "s|^\s*(gtk-theme-name=)(\"?).*\2|\1\2$GTK_THEME\2|"               .gtkrc-2.0
    replace_line "s|^\s*(gtk-icon-theme-name=)(\"?).*\2\s*|\1\2$ICONS\2|"           .gtkrc-2.0
    replace_line "s|^\s*(gtk-theme-name=)(\"?).*\2|\1\2$GTK_THEME\2|"               .config/gtk-3.0/settings.ini
    replace_line "s|^\s*(gtk-icon-theme-name=)(\"?).*\2\s*|\1\2$ICONS\2|"           .config/gtk-3.0/settings.ini

    replace_file $theme .dillo/style.css
    replace_file $theme .jwm/theme

    [ "$PRETEND" ] && return

    restart_desktop
}

replace_line() {
    local regex=$1 file=$2
    # We are called by del_line_skel which already adds $IDIR
    [ -z "${file##/*}" ] || file=$DIR/$file
    test -e "$file" || return

    if [ "$PRETEND" -o "$VERBOSE" ]; then
        echo -en "file $file:\n  "
        sed -n -r "$regex"p "$file"
    fi

    [ "$PRETEND" ] && return
    sed -i -r "$regex" "$file"
}

replace_file() {
    local theme=$1  file=$2
    [ -z "${file##/*}" ] || file=$DIR/$file
    local new=$file.$theme

    if ! test -e "$new"; then
        warn "Missing file $new"
        return
    fi

    local type=$(stat -c %F "$file" 2>/dev/null)
    case $type in
        sym*) cmd="ln -sf" ; new=$(basename $new) ;;
           *) cmd="cp -af"                        ;;
    esac

    if [ "$PRETEND" -o "$VERBOSE" ]; then
        echo $cmd $new $file
    fi

    [ "$PRETEND" ] && return
    $cmd $new $file
}

restart_desktop() {
    local restart=/usr/local/lib/desktop-session/desktop-session-restart

    [ "$NO_RESTART"    ] && return
    [ "$DISPLAY"       ] || return
    [ "$DIR" = "$HOME" ] || return
    [ $UID -eq 0       ] && return
    [ -x $restart      ] || return

    $restart
}

warn() {
    echo "$ME warning: $*" >&2
}

fatal() {
    echo "$ME Error: $*" >&2
    exit 3
}


main "$@"

exit 0
