#!/bin/bash

KWORKFLOW=${KWORKFLOW:-'kw'}

# Global paths

# Kw shell files
if [[ -f '/usr/bin/kw' ]]; then
  KW_LIB_DIR='/usr/share/kw'
else
  KW_LIB_DIR="${KW_LIB_DIR:-"${HOME}/.local/lib"}/${KWORKFLOW}"
fi

KW_PLUGINS_DIR="${KW_PLUGINS_DIR:-"$KW_LIB_DIR/plugins"}"

# Share files
KW_SHARE_DIR="${XDG_DATA_HOME:-"$HOME/.local/share"}/$KWORKFLOW"
KW_DOC_DIR="$KW_SHARE_DIR/doc"
KW_MAN_DIR="$KW_SHARE_DIR/man"
KW_SOUND_DIR="$KW_SHARE_DIR/sound"

# User specific data files (currently this collapses with the share dir,
# but would not for a system-wide installation)
KW_DATA_DIR="${XDG_DATA_HOME:-"$HOME/.local/share"}/$KWORKFLOW"

# Configuration files
KW_ETC_DIR="${XDG_CONFIG_HOME:-"$HOME/.config"}/$KWORKFLOW"

# Cache folder
KW_CACHE_DIR="${XDG_CACHE_HOME:-"$HOME/.cache"}/$KWORKFLOW"

# State files
KW_STATE_DIR="${XDG_STATE_HOME:-"$HOME/.local/state"}/$KWORKFLOW"

# ENV dir name
ENV_DIR='envs'

##BEGIN-DEV-MODE##
KW_BIN="$(readlink -f "${BASH_SOURCE[0]}")"
KW_BASE_DIR="$(dirname "${KW_BIN}")"
if [ -f "${KW_BASE_DIR}/src/kwlib.sh" ]; then
  # running from source directory
  KW_LIB_DIR="${KW_BASE_DIR}/src"
  # KW_DATA_DIR # use default data folder
  KW_DOC_DIR="${KW_BASE_DIR}/documentation"
  KW_MAN_DIR="${KW_BASE_DIR}/documentation/man"
  KW_SOUND_DIR="${KW_BASE_DIR}/sound"
  KW_ETC_DIR="${KW_BASE_DIR}/etc"
  KW_PLUGINS_DIR="${KW_LIB_DIR}/plugins"
  # KW_CACHE_DIR # use default cache folder
fi
##END-DEV-MODE##

# Export external variables required by kworkflow
export KWORKFLOW
# This is the one and only time a file will be sourced this way.
# The include function (sourced from this file) should always be used for file sourcing.
. "$KW_LIB_DIR/kw_include.sh" --source-only

include "$KW_LIB_DIR"/signal_manager.sh

function kw()
{
  action="$1"
  shift

  signal_manager || warning 'Was not able to set signal handler'

  mkdir -p "$KW_CACHE_DIR"

  case "$action" in
    init)
      (
        include "$KW_LIB_DIR/init.sh"

        init_kw "$@"
        return "$?"
      )
      ;;
    build | b)
      (
        include "$KW_LIB_DIR/build.sh"

        kernel_build '' "$@"
        local ret="$?"
        alert_completion 'kw build' "$1"
        return "$ret"
      )
      ;;
    deploy | d)
      (
        include "$KW_LIB_DIR/deploy.sh"

        deploy_main '' "$@"
        local ret="$?"
        alert_completion 'kw deploy' "$1"
        return "$ret"
      )
      ;;
    bd)
      (
        include "$KW_LIB_DIR/deploy.sh"
        include "$KW_LIB_DIR/build.sh"

        kernel_build && deploy_main 1 "$@"
        local ret="$?"
        alert_completion 'kw bd' "$1"
        return "$ret"
      )
      ;;
    diff | df)
      include "$KW_LIB_DIR/diff.sh"

      diff_manager "$@"
      ;;
    ssh | s)
      (
        include "${KW_LIB_DIR}/kw_config_loader.sh"
        include "${KW_LIB_DIR}/kw_ssh.sh"

        kw_ssh_main "$@"
      )
      ;;
    vars)
      (
        include "$KW_LIB_DIR/kw_config_loader.sh"

        show_variables_main "$@"
      )
      ;;
    codestyle | c)
      (
        include "$KW_LIB_DIR/checkpatch_wrapper.sh"

        execute_checkpatch "$@"
      )
      ;;
    self-update | u)
      (
        include "${KW_LIB_DIR}/self_update.sh"

        self_update_main "$@"
      )
      ;;
    maintainers | m)
      (
        include "${KW_LIB_DIR}/maintainers.sh"

        maintainers_main "$@"
      )
      ;;
    kernel-config-manager | k)
      (
        include "$KW_LIB_DIR/kernel_config_manager.sh"

        kernel_config_manager_main "$@"
      )
      ;;
    config | g)
      (
        include "$KW_LIB_DIR/config.sh"

        config_main "$@"
      )
      ;;
    remote)
      (
        include "$KW_LIB_DIR/kw_remote.sh"

        remote_main "$@"
      )
      ;;
    help | --help)
      (
        include "$KW_LIB_DIR/help.sh"

        kworkflow_man
      )
      ;;
    h | -h)
      (
        include "$KW_LIB_DIR/help.sh"

        kworkflow_help
      )
      ;;
    explore | e)
      (
        include "$KW_LIB_DIR/explore.sh"

        explore_main "$@"
        return "$?"
      )
      ;;
    man)
      (
        include "$KW_LIB_DIR/help.sh"

        kworkflow_man "$@"
      )
      ;;
    version | --version | -v)
      (
        include "$KW_LIB_DIR/help.sh"

        kworkflow_version
      )
      ;;
    pomodoro | p)
      (
        include "$KW_LIB_DIR/pomodoro.sh"

        pomodoro "$@"
      )
      ;;
    report | r)
      (
        include "$KW_LIB_DIR/report.sh"

        report_main "$@"
      )
      ;;
    device)
      (
        include "$KW_LIB_DIR/device_info.sh"

        device_info "$@"
      )
      ;;
    backup)
      (
        include "$KW_LIB_DIR/backup.sh"

        backup "$@"
      )
      ;;
    debug)
      (
        include "$KW_LIB_DIR/debug.sh"

        debug_main "$@"
      )
      ;;
    mail)
      (
        include "$KW_LIB_DIR/mail.sh"

        mail_main "$@"
      )
      ;;
    env)
      (
        include "${KW_LIB_DIR}/kw_env.sh"

        env_main "$@"
      )
      ;;
    upstream-patches-ui)
      (
        include "${KW_LIB_DIR}/upstream_patches_ui.sh"

        upstream_patches_ui_main "$@"
      )
      ;;
    clear-cache)
      include "$KW_LIB_DIR/deploy.sh"

      cleanup
      ;;
    # Subsystems support
    drm)
      (
        include "${KW_PLUGINS_DIR}/subsystems/drm/drm.sh"

        drm_main "$@"
      )
      ;;
    # VM
    vm)
      (
        include "${KW_LIB_DIR}/vm.sh"

        vm_main "$@"
      )
      ;;

    *)
      (
        include "$KW_LIB_DIR/help.sh"

        complain 'Invalid option'
        kworkflow_help
        return 1
      )
      ;;
  esac
}

kw "$@"
