# shellcheck shell=bash
# ==========================================================================
#         ____            _                     _____           _
#        / ___| _   _ ___| |_ ___ _ __ ___     |_   _|__   ___ | |___
#        \___ \| | | / __| __/ _ \ '_ ` _ \ _____| |/ _ \ / _ \| / __|
#         ___) | |_| \__ \ ||  __/ | | | | |_____| | (_) | (_) | \__ \
#        |____/ \__, |___/\__\___|_| |_| |_|     |_|\___/ \___/|_|___/
#               |___/
#                             --- System-Tools ---
#                  https://www.nntb.no/~dreibh/system-tools/
# ==========================================================================
#
# Print-UTF8
# Copyright (C) 2024-2026 by Thomas Dreibholz
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Contact: thomas.dreibholz@gmail.com


# ###### Bash completion for print-utf8 #####################################
_print_utf8()
{
   # Based on: https://www.benningtons.net/index.php/bash-completion/
   local cur prev words cword
   if type -t _comp_initialize >/dev/null; then
      _comp_initialize || return
   elif type -t _init_completion >/dev/null; then
      _init_completion || return
   else
      # Manual initialization for older bash completion versions:
      COMPREPLY=()
      cur="${COMP_WORDS[COMP_CWORD]}"
      # shellcheck disable=SC2034
      prev="${COMP_WORDS[COMP_CWORD-1]}"
      # shellcheck disable=SC2034,SC2124
      words="${COMP_WORDS[@]}"
      # shellcheck disable=SC2034
      cword="${COMP_CWORD}"
   fi

   # To handle multi-argument parameters:
   local prev2="" prev3=""
   [[ ${cword} -ge 2 ]] && prev2="${words[cword-2]}"
   [[ ${cword} -ge 3 ]] && prev3="${words[cword-3]}"

   # ====== Handle 1st argument =============================================
   case "${prev}" in
      # ====== Special case: terminal columns ===============================
      -x | --columns)
         local terminalColumns sortedColumnsList
         terminalColumns="$(print-utf8 -t | awk '{ print $1 }')"
         sortedColumnsList="$(printf "%s\n" "${terminalColumns}" 60 78 80 100 120 128 140 160 180 200 | sort -nu)"
         compopt -o nosort 2>/dev/null || true   # No sorting (Bash >= 4.4)
         mapfile -t COMPREPLY < <(compgen -W "${sortedColumnsList}" -- "$cur")
         return
         ;;

      # ====== Special case: indentation ====================================
      -i | --indent | \
      -I | --multiline-indent)
         compopt -o nosort 2>/dev/null || true   # No sorting (Bash >= 4.4)
         mapfile -t COMPREPLY < <(compgen -W "-64 -48 -32 -24 -20 -16 -12 -10 0 10 12 16 20 24 32 48 64" -- "$cur")
         return
         ;;

      # ====== Special case: border decoration ==============================
      -s | --separator |\
      -C | --multiline-center)
         # Left border decorations:
         local suggestions=("#" "=" "|" "║"   "▌" "▐"   "│" "┃" "┆" "┇" "┊" "┋" "😀")
         local matches
         mapfile -t matches < <(compgen -W "${suggestions[*]}" -- "$cur")
         COMPREPLY=( "${matches[@]@Q}" )
         return
         ;;
   esac

   # ====== Special case: multiline-indent, multiline-center, separator =====
   # Handle 2nd argument
   case "${prev2}" in
      # ====== Special case: border decoration ==============================
      -I | --multiline-indent | \
      -C | --multiline-center)
         # Left (multiline-indent) or right (multiline-center) border decorations:
         local suggestions=("#" "=" "|" "║"   "▌" "▐"   "│" "┃" "┆" "┇" "┊" "┋" "😀")
         local matches
         mapfile -t matches < <(compgen -W "${suggestions[*]}" -- "$cur")
         COMPREPLY=( "${matches[@]@Q}" )
         return
         ;;

      # ====== Generic value ================================================
      -s | --separator)
         # Horizontal border decorations:
         local suggestions=("#" "=" "-" "─" "═"   "▀" "▄"   "━")
         local matches
         mapfile -t matches < <(compgen -W "${suggestions[*]}" -- "$cur")
         COMPREPLY=( "${matches[@]@Q}" )
         return
         ;;
   esac

   # ====== Special case: multiline-indent, separator =======================
   # Handle 3rd argument
   case "${prev3}" in
      # ====== Generic value ================================================
      -I | --multiline-indent | \
      -s | --separator)
         # Right border decorations:
         local suggestions=("#" "=" "|" "║"   "▌" "▐"   "│" "┃" "┆" "┇" "┊" "┋" "😀")
         local matches
         mapfile -t matches < <(compgen -W "${suggestions[*]}" -- "$cur")
         COMPREPLY=( "${matches[@]@Q}" )
         return
         ;;
   esac

   # ====== All options =====================================================
   local opts="
-n
--newline
-i
--indent
-x
--columns
-c
--center
-I
--multiline-indent
-C
--multiline-center
-s
--separator
-b
--size
-l
--length
-w
--width
-a
--size-length-width
-t
--terminal-info
-h
--help
-v
--version"
   mapfile -t COMPREPLY < <(compgen -W "${opts}" -- "${cur}" )
   return 0
}

complete -F _print_utf8 print-utf8
