#!/usr/bin/env bash
#-*-coding:utf-8 -*-
#Auto updated?
#   Yes
#File:
#   pacsync
#Author:
#   The-Repo-Club [wayne6324@gmail.com]
#Github:
#   https://github.com/The-Repo-Club/
#
#Created:
#   Tue 25 October 2022, 07:04:14 AM [GMT+1]
#Modified:
#   Wed 16 November 2022, 06:44:01 AM [GMT]
#
#Description:
#   FZF menu for pacman yay or pikaur
#
#Dependencies:
#   bash, pacman, yay, pikaur
#
# shellcheck disable=all

colorize() {
    local string
    string="${1//\[/\\033\[0;32m\[}"
    string="${string//\]/\]\\033\[0m}"
    echo -n -e "${string}"
}

CP_KEY="ctrl-p"
CA_KEY="ctrl-a"
CI_KEY="ctrl-i"
CQ_KEY="ctrl-q"
TP_KEY="ctrl-t"

HEADER=$(colorize "[ENTER] Install selected [${TP_KEY^^}] Toggle preview
[${CP_KEY^^}] Pacman [${CA_KEY^^}] AUR [${CI_KEY^^}] Installed
[${CQ_KEY^^}] Quit")

function go_pacman() {
    cmd=$(pacman -Slq | fzf --prompt '  pacman> ' \
        --header "${HEADER}" \
        --bind "${CP_KEY}:execute:pacsync 'pacman'" \
        --bind "${CA_KEY}:execute:pacsync 'aur'" \
        --bind "${CI_KEY}:execute:pacsync 'installed'" \
        --bind "${CQ_KEY}:execute:pkill fzf" \
        --bind "${TP_KEY}:toggle-preview" \
        --multi --height=80% --preview 'sleep 2; yay -Si {1}' \
        --preview-window 'right,wrap') #| xargs -ro pacman -S
    cmd=${cmd//$'\n'/ }           # newline -> space
    if [ -n "$cmd" ]; then
        pikaur -S "$cmd"
    fi
    exit
}

function go_aur() {
    cmd=$(yay -Slq | fzf --prompt '  pikaur> ' \
        --header "${HEADER}" \
        --bind "${CP_KEY}:execute:pacsync 'pacman'" \
        --bind "${CA_KEY}:execute:pacsync 'aur'" \
        --bind "${CI_KEY}:execute:pacsync 'installed'" \
        --bind "${CQ_KEY}:execute:pkill fzf" \
        --bind "${TP_KEY}:toggle-preview" \
        --multi --height=80% --preview 'sleep 2; yay -Si {1}' \
        --preview-window 'right,wrap') #| xargs -ro pikaur -S
    cmd=${cmd//$'\n'/ }           # newline -> space
    if [ -n "$cmd" ]; then
        pikaur -S "$cmd"
    fi
    exit
}

function go_installed() {
    cmd=$(pacman -Qq | fzf --prompt '  installed> ' \
        --header "${HEADER}" \
        --bind "${CP_KEY}:execute:pacsync 'pacman'" \
        --bind "${CA_KEY}:execute:pacsync 'aur'" \
        --bind "${CI_KEY}:execute:pacsync 'installed'" \
        --bind "${CQ_KEY}:execute:pkill fzf" \
        --bind "${TP_KEY}:toggle-preview" \
        --multi --height=80% --preview 'sleep 2; yay -Si {1}' \
        --preview-window 'right,wrap') #| xargs -ro pacman -S
    cmd=${cmd//$'\n'/ }           # newline -> space
    if [ -n "$cmd" ]; then
        pikaur -R "$cmd"
    fi
    exit
}

if command -v fzf > /dev/null 2>&1; then
    FUZZYSEL=fzf
    fuzzy_default_options=(
      "--inline-info" "--cycle" "--ansi" "-e"
      "--no-sort" "--layout=reverse-list"
      "--border=${BORDER:-sharp}"
    )
    export FZF_DEFAULT_OPTS="${fuzzy_default_options[*]}"
  else
    echo "Unable to find 'fzf' fuzzy finder"
    exit
  fi

case $1 in
*pacman)
    go_pacman
    ;;
*aur)
    go_aur
    ;;
*installed)
    go_installed
    ;;
*)
    go_pacman
    ;;
esac