
mst(){
  OUT=""

  if [[ $1 =~ ^[0-9]+$ ]]; then

      if [ "$2" == "bbr" ]; then
          OUT="\033[1;38;5;$1m"
      else
          OUT="\033[38;5;$1m"
      fi
  else
      if echo "$@" | grep -q "rst"; then
          OUT="$CSS_RESET"
      else
        if echo "$@" | grep -q "1sp"; then
            OUT="$CSS_NBSP"
        elif echo "$@" | grep -q "2sp"; then
            OUT="$CSS_NBSP$CSS_NBSP"
        fi

        if echo "$@" | grep -q "bbr"; then
            OUT+="$CSS_BOLDBRIGHT"
        elif echo "$@" | grep -q "yb"; then
            OUT+="$CSS_YELLOWB"
        elif echo "$@" | grep -q "cb"; then
            OUT+="$CSS_CYANB"
        elif echo "$@" | grep -q "bb"; then
            OUT+="$CSS_BLUEB"
        elif echo "$@" | grep -q "gb"; then
            OUT+="$CSS_GREENB"
        elif echo "$@" | grep -q "rb"; then
            OUT+="$CSS_REDB"
        elif echo "$@" | grep -q "y"; then
            OUT+="$CSS_YELLOW"
        elif echo "$@" | grep -q "c"; then
            OUT+="$CSS_CYAN"
        elif echo "$@" | grep -q "b"; then
            OUT+="$CSS_BLUE"
        elif echo "$@" | grep -q "g"; then
            OUT+="$CSS_GREEN"
        elif echo "$@" | grep -q "r"; then
            OUT+="$CSS_RED"
        fi
      fi
  fi
  echo "$OUT"
}

hr(){
    line="─"
    clr=""
    rst=""
    wcols=$(tput cols)

    if echo "$@" | grep -q "danger"; then
        if echo "$@" | grep -q "3"; then
            clr=$(mst "rb")
        else
            clr=$(mst "r")
        fi
    elif echo "$@" | grep -q "success"; then
        if echo "$@" | grep -q "3"; then
            clr=$(mst "gb")
        else
            clr=$(mst "g")
        fi
    elif echo "$@" | grep -q "cyan"; then
        if echo "$@" | grep -q "3"; then
            clr=$(mst "cb")
        else
            clr=$(mst "c")
        fi
    elif echo "$@" | grep -q "yellow"; then
        if echo "$@" | grep -q "3"; then
            clr=$(mst "yb")
        else
            clr=$(mst "y")
        fi
    elif echo "$@" | grep -q "blue"; then
        if echo "$@" | grep -q "3"; then
            clr=$(mst "bb")
        else
            clr=$(mst "b")
        fi
    elif echo "$@" | grep -q "green"; then
        if echo "$@" | grep -q "3"; then
            clr=$(mst "gb")
        else
            clr=$(mst "g")
        fi
    elif echo "$@" | grep -q "red"; then
        if echo "$@" | grep -q "3"; then
            clr=$(mst "rb")
        else
            clr=$(mst "r")
        fi
    elif echo "$@" | grep -q "noclr"; then
        if echo "$@" | grep -q "3"; then
            clr=$(mst "bbr")
        else
            clr=""
        fi
    elif [[ -n "$SS_COLOR_BASE" ]] && [[ $SS_COLOR_BASE =~ ^[0-9]+$ ]]; then
        if echo "$@" | grep -q "3"; then
            clr=$(mst $SS_COLOR_BASE "bbr")
        else
            clr=$(mst $SS_COLOR_BASE)
        fi
    fi

    if echo "$@" | grep -q "w50"; then
        wcols=50
    elif echo "$@" | grep -q "w30"; then
        wcols=30
    elif echo "$@" | grep -q "w10"; then
        wcols=10
    fi

    if [[ -n "$clr" ]]; then
        rst=$(mst "rst")
    fi
    printf "${clr}""%.0s${line}""${rst}" $(seq 1 "${wcols}"); echo
}

menu_bar(){

    clr=""
    rst=""

    if [[ -n "$SS_COLOR_BASE" ]] && [[ $SS_COLOR_BASE =~ ^[0-9]+$ ]]; then
        clr=$(mst $SS_COLOR_BASE)
    fi
    if [[ -n "$clr" ]]; then
        rst=$(mst "rst")
    fi
    echo "$clr""────────────────────""$rst"
}

# Language function
sslang(){
    local lstring="$1"
    if [ "$SS_PKG_MGR" == "moss" ]; then
        lstring=$(echo "$lstring" | sed 's/eopkg/moss/Ig')
    fi
    echo "$lstring"
}


ss_format_help(){

    "$1" --help "${@:2}" | awk '
      /^ +-/ {
          if (buffer ~ /:$/) {
              exit # Stop immediately without printing the buffer
          }
      }
      NR > 1 { print buffer }
      { buffer = $0 }
  '

}
# General fzf wrapper with defaults
sa_fzf() {
  fzf --ansi\
      --color="$SS_FZF_COLORS" \
      --delimiter='|' \
      --with-nth=2 \
      --nth=1 \
      --pointer='>' \
      --no-input\
      --disabled\
      --style="full"\
      --border\
      --border-label=" $MSG_APP_NAME - v$SS_VERSION "\
      --footer-border \
      --footer="$MENU_FOOTER" \
      --highlight-line\
      --height=100% \
      --min-height=30 \
      --wrap \
      --cycle \
      --preview-label=" $MSG_GEN_INFO "\
      --preview-window=right,70%,wrap\
      --reverse \
      "$@"  # specific args for action
}
# Package list fzf wrapper with defaults
pkg_fzf() {
  fzf --ansi\
      --color="$SS_FZF_COLORS" \
      --delimiter='|' \
      --with-nth=2 \
      --nth=1 \
      --marker='✓ ' \
      --pointer='>' \
      --style="full"\
      --border\
      --border-label=" $MSG_APP_NAME - v$SS_VERSION "\
      --footer-label=" $MSG_FTR_MS " \
      --footer-label-pos=0 \
      --footer-border \
      --footer="$MENU_FOOTER" \
      --highlight-line\
      --height=100% \
      --min-height=30 \
      --multi \
      --wrap="word" \
      --cycle \
      --ignore-case \
      --preview-label=" $MSG_GEN_INFO "\
      --preview-window=right,70%,wrap-word\
      --reverse \
      "$@"  # specific args for action
}
# Appstream list
as_fzf() {
  fzf --ansi\
      --color="$SS_FZF_COLORS" \
      --delimiter='|' \
      --with-nth=2 \
      --nth=1 \
      --marker='✓ ' \
      --pointer='>' \
      --style="full" \
      --list-label=" ALT + [F] flatpak [P] eopkg [A] all " \
      --border\
      --border-label=" $MSG_APP_NAME - v$SS_VERSION "\
      --footer-border \
      --footer="$MENU_FOOTER | ALT+F/P/A Filter by type" \
      --highlight-line\
      --height=100% \
      --min-height=30 \
      --wrap \
      --cycle \
      --ignore-case \
      --bind 'alt-f:transform:echo "{q}" | grep -q "[F] " && echo "change-query()" || echo "change-query([F] )"'  \
      --bind 'alt-p:transform:echo "{q}" | grep -q "[P] " && echo "change-query()" || echo "change-query([P] )"' \
      --bind 'alt-a:transform:echo "{q}" | grep -q "" && echo "change-query()" || echo "change-query()"' \
      --reverse \
      "$@"  # specific args for action
}

ss_life(){

  if [ ! -f "$SS_CACHE_PATH/birthdate" ]; then
    raw_date=$(LC_ALL=C eopkg history -N | awk '/Operation #1:/ {getline; sub("Date: ", ""); print}')

    # Check if Operation #1 was actually found
    if [[ -n "$raw_date" ]]; then
      echo "$raw_date" > $SS_CACHE_PATH/birthdate
    else
      touch $SS_CACHE_PATH/birthdate
    fi
  else
    raw_date=$(< "$SS_CACHE_PATH/birthdate")
  fi
  if [[ -n "$raw_date" ]]; then
    BDAY="${CSS_BOLDBRIGHT}${MSG_GEN_SYSLIFE}:${CSS_RESET} "
    install_sec=$(date -d "$raw_date" +%s)
    current_sec=$(date +%s)
    diff_days=$(( (current_sec - install_sec) / 86400 ))
    if (( diff_days >= 365 )); then
        years=$(( diff_days / 365 ))
        remaining_days=$(( diff_days % 365 ))
        BDAY+="${years} ${MSG_GEN_YEARS} / ${remaining_days} ${MSG_GEN_DAYS}"
    else
        BDAY+="${diff_days} ${MSG_GEN_DAYS}"
    fi
    echo -e "${BDAY}"
  fi

}

ss_debug(){

eopkgVer=$(eopkg --version)
eoRepos=$(eopkg lr)
fpVer=$(flatpak --version)
fpRepos=$(flatpak remotes)


OUT="
Version: $SS_VERSION
----------------------------------
Config
----------------------------------
Lang: $SS_LANG
Theme: $SS_THEME
Fasfetch: $SS_FASTFETCH
Assume Yes: $SS_ASSUMEYES
EOPKG Local Cache: $SS_EOPKG_LCACHE
EOPKG Repo: $SS_SOLUS_REPO
Local Repo: $SS_SOLUS_LR
Unstable: $SS_SOLUS_US
Active Repo Cnt: $SS_SOLUS_RCNT
Local Config: $SS_LOCAL_CFG
Editor: $SS_EDITOR
----------------------------------
System
----------------------------------
EOPKG Version: $eopkgVer
EOPKG Local Index Status $SS_EOPKG_FINDEX
EOPKG Repos:
$eoRepos

Flatpak Version: $fpVer
Flatpak Repos:
$fpRepos

"
echo "$OUT"
}

ss_fetch(){

  echo -e "${CSS_CYANB}Kernel     ${CSS_RESET} $(uname -r)"

  # Load Average
  read -r l1 l2 l3 _ < /proc/loadavg
  echo -e "${CSS_CYANB}Load       ${CSS_RESET} $l1, $l2, $l3"

  # Memory
  mem_total_kb=$(grep "MemTotal" /proc/meminfo | awk '{print $2}')
  mem_avail_kb=$(grep "MemAvailable" /proc/meminfo | awk '{print $2}')
  mem_used_kb=$((mem_total_kb - mem_avail_kb))

  # Calculate in awk for float precision (matches fastfetch's %.2f GiB)
  memInfo=$(awk -v used="$mem_used_kb" -v total="$mem_total_kb" 'BEGIN {
      u_gib = used / 1024 / 1024
      t_gib = total / 1024 / 1024
      pct = (used / total) * 100
      printf "%.2f GiB / %.2f GiB (%.0f%%)", u_gib, t_gib, pct
  }')
  echo -e "${CSS_CYANB}Memory     ${CSS_RESET} $memInfo"

  # Disk (Root /)
  diskInfo=$(df -B1 -T / | tail -n 1 | awk '{
      type=$2
      total=$3
      used=$4

      # Calculate percentage
      pct=(used/total)*100

      # Auto-scale units for Used (GiB usually)
      u_val = used / 1073741824
      u_unit = "GiB"

      # Auto-scale units for Total
      if (total >= 1099511627776) {
          t_val = total / 1099511627776
          t_unit = "TiB"
      } else {
          t_val = total / 1073741824
          t_unit = "GiB"
      }

      printf "%.2f %s / %.2f %s (%.0f%%) - %s\n", u_val, u_unit, t_val, t_unit, pct, type
  }')

  echo -e "${CSS_CYANB}Disk       ${CSS_RESET} $diskInfo"

  # Packages
  pkgs_output=""

  # Check for eopkg
  if command -v eopkg &> /dev/null; then
    if [ -f "$PI_CACHE_FILE" ]; then
        count=$(wc -l < "$PI_CACHE_FILE")
    else
        count=$(eopkg li | wc -l)
    fi
    pkgs_output="${pkgs_output}${count} (eopkg)"
  fi

  # Check for Flatpak
  if command -v flatpak &> /dev/null; then
    if [ -f "$FI_CACHE_FILE" ]; then
        count=$(wc -l < "$FI_CACHE_FILE")
    else
        count=$(flatpak list --app | wc -l)
    fi
	if [[ "$count" -gt 0 ]]; then
        pkgs_output="${pkgs_output}, ${count} (flatpak)"
    fi
  fi
  pkgs_output=${pkgs_output%, }

  echo -e "${CSS_GREENB}Packages   ${CSS_RESET} $pkgs_output"
}

get_changelog(){

	if command -v curl >/dev/null 2>&1; then
		CLVER=${SS_VERSION//./}
		CLFILE="$SS_CACHE_PATH/changelog$CLVER"
		if [ ! -f "$CLFILE" ]; then
			rm -f "$SS_CACHE_PATH"/changelog*
			curl -s https://api.github.com/repos/clintre/solseek/releases/latest | awk -F'"' '/"body":/{print $4; exit}' > "$CLFILE"
		fi
		CLTXT=$(< "$CLFILE")
		if [ -n "$CLTXT" ]; then
			echo -e "$MSG_GEN_CLTITLE v$SS_VERSION\n\n$CLTXT"

		fi
	fi
}

ss_info_pane(){

PANELTXT=""
case "$1" in
"welcome" | "")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_GUIDE_TITLE ${CSS_RESET}
$MSG_PNL_GUIDE_BODY

📘 https://solseek.org/wiki";;
"pkgaction")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_PKGACT_TITLE ${CSS_RESET}
$MSG_PNL_PKGACT_BODY

";;
"installed")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_INSTALLED_TITLE ${CSS_RESET}

$MSG_PNL_INSTALLED_BODY

";;
"search")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_SEARCH_TITLE ${CSS_RESET}

$MSG_PNL_SEARCH_BODY

";;
"rollback")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_RB_TITLE ${CSS_RESET}
$MSG_PNL_RB_BODY";;
"rollbacklist")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_RB_TITLE ${CSS_RESET}
$MSG_PNL_RB_HELP";;
"about")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_ABOUT_TITLE $MSG_APP_NAME ${CSS_RESET}

$MSG_PNL_ABOUT_BODY

$(get_changelog)

";;
"sscfg")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_SSCFG_TITLE ${CSS_RESET}

$MSG_PNL_SSCFG_BODY";;
"sstmr")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_SSTMR_TITLE ${CSS_RESET}

$MSG_PNL_SSTMR_BODY";;
esac

case "$1" in
"list")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_LIST_TITLE ${CSS_RESET}

$MSG_PNL_LIST_BODY

";;
esac

case "$1" in
"deskapps")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_DESKAPPS_TITLE ${CSS_RESET}

$MSG_PNL_DESKAPPS_BODY

";;
esac

case "$1" in
"update")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_UPD_TITLE ${CSS_RESET}
$MSG_PNL_UPD_BODY";;
esac

case "$1" in
"tools")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_TOOL_TITLE ${CSS_RESET}

$MSG_PNL_TOOL_BODY";;
esac

case "$1" in
"drivers")
PANELTXT+="${CSS_BOLDBRIGHT}$MSG_PNL_DRIVERS_TITLE ${CSS_RESET}

$MSG_PNL_DRIVERS_BODY";;
esac
echo -e "$PANELTXT" | fold -s -w 70 2>/dev/null

}
