# -*- shell-script -*-

################################################################################

§class "mode" --with-interface \
    --properties "name" \
                 "terminal=__TERMINAL__" \
                 "geometry=80x24" \
                 "font" \
                 "boldfont" \
                 "foreground" \
                 "background" \
                 "options" \
                 "completion=complete" \
                 "unmap:b=0" \
                 "feedback:b=0" \
                 "netwmstate" \
                 "onmap" \
                 "onunmap" \
                 "cmdnfh:b=0" \
                 "logfile=/dev/null" \
                 "superuser=Administrator" \
                 "current=0"

§function.clone "§mode.get_geometry" "§mode._get_geometry"
§function.clone "§modes.dump" "§modes._dump"
§function.clone "§mode.code" "§mode._code"

################################################################################

function §mode.get_geometry {
    
    if (( $# == 0 )); then
	§mode._get_geometry
	return 0
    fi

    local wanted="${1:-0}"
    local geometry="$(§mode._get_geometry)"
    local g="" i=0

    for g in $geometry; do	
	if (( i == wanted )); then
	    printf '%s' "$g"
	    break
	else
	    (( i+=1 ))
	fi
    done
}

function §mode.unmap? {
    (( $(§mode.get_unmap) == 1 && bashrun_debug == 0 ))
}

function §modes.init {
    §modes.seek "$bashrun_mode";
    §mode.init
}

function §mode.init {

    local name="$(§mode.get_name)"

    local onmap="$(§mode.get_onmap)"
    local onunmap="$(§mode.get_onunmap)"

    if §function.defined? "+mode-$name-init"; then
	§separator "Running +mode-$name-init"
	+mode-$name-init
    fi

    # init logfile
    bashrun_logfile="$(§mode.get_logfile)"

    # init completion
    §completion.init

    # dump modeinfo for frontend if required
    (( bashrun_frontend )) && §mode.write_info
}

function §mode.write_info {
    local mode="$(§mode.get_name)"
    local file="$bashrun_cache_home/${mode}-info"
    
    local terminal="$(§mode.get_terminal)"
    local geometry="$(§mode.get_geometry 0)"
    local font="$(§mode.get_font)"
    local boldfont="$(§mode.get_boldfont)"
    local foreground="$(§mode.get_foreground)"
    local background="$(§mode.get_background)"
    local options="$(§mode.get_options)"
    local feedback="$(§mode.get_feedback)"
    local onmap="$(§mode.get_onmap)"
    local onunmap="$(§mode.get_onunmap)"
    local netwmstate="$(§mode.get_netwmstate)"

    if §templates.seek "$terminal"; then
	terminal="$(§template.create_commandline "bashrun" "bashrun2-$mode" "$geometry" "$font" "$boldfont" "$foreground" "$background" "$options")"
    fi

    §quote terminal font boldfont foreground background \
	options onmap onunmap netwmstate

    printf '%s\n' "# mode info
          pid=$$
          wid=$WINDOWID
	  terminal=$terminal
          geometry=$geometry
          font=$font
          boldfont=$boldfont
          foreground=$foreground
          background=$background 
          options=$options
          feedback=$feedback
          onmap=$onmap
          onunmap=$onunmap
          netwmstate=$netwmstate" > $file
}

function §mode.reset {
    
    local name="$(§mode.get_name)"
    if [[ "$(type -t +mode-$name-leave)" == "function" ]]; then
	+mode-$name-leave
    fi
}

function §mode.code {

    §mode._code
    local name="$(§mode.get_name)"

    if §function.defined? "+mode-$name-init"; then
	printf '\n'
	§function.code "+mode-$name-init"
    fi
}

function §modes.dump {

    local file="$(§objects.data_home)/${1:-§modes.dump}"
    local mode=''
    local func=''

    §modes._dump "${1:-§modes.dump}"

    §modes.seek_start
    while §modes.next?; do
	mode=$(§mode.get_name)
	
	func="+mode-$mode-init"
	if §function.defined? "$func"; then
	    §function.code "$func" >> $file
	fi
	§modes.next
    done
    §modes.seek $bashrun_mode

    # bashrun completion helper
    §modes.list > $bashrun_cache_home/modes
}
