#!/usr/bin/env bash

## Import the search shortcuts specified in this script into the given
## Chrome/Chromium profile.
##
## Usage: import-search-shortcuts <profile-path>
##
## Dependencies: GNU coreutils, GNU sed, procps, SQLite
##
## I wrote this script because I disliked managing dozens of search shortcuts
## using chrome://settings/searchEngines and I wanted to manage them using my
## text editor.

set -euo pipefail
shopt -s inherit_errexit

die() { echo "${0##*/}: $1" >&2; exit 1; }

[[ " $* " =~ ' --help ' ]] && sed -n 's/^## \?//p' "$0" && exit
(( $# )) || die 'missing argument'
(( $# > 1 )) && die 'invalid argument'

profile=$1
[[ -d $profile ]] || die "directory not found: $profile"

web_data="$profile/Web Data"
[[ -f $web_data ]] || die "file not found: $web_data"

if [[ $profile =~ chromium ]]; then
  pgrep chromium-browser &> /dev/null && die 'Chromium must not be running'
elif [[ $profile =~ google-chrome ]]; then
  pgrep google-chrome &> /dev/null && die 'Chrome must not be running'
fi

declare -A shortcuts=(
  [alternativeto]='https://www.google.com/search?nfpr=1&q=%s+site:alternativeto.net'
  [amazon]='https://www.amazon.com/s?k=%s'
  [amazonbooks]='https://www.amazon.com/s?i=stripbooks&k=%s'
  [amazontechbooks]='https://www.amazon.com/s?rh=n%3A5&k=%s'
  [appstore]='https://www.google.com/search?nfpr=1&q=%s+site:apps.apple.com/us/app'
  [archforums]='https://www.google.com/search?nfpr=1&q=%s+site:bbs.archlinux.org+|+site:lists.archlinux.org+|+site:reddit.com/r/archlinux'
  [archman]='https://man.archlinux.org/search?go=Go&q=%s'
  [archpackages]='https://archlinux.org/packages/?q=%s'
  [bashdocs]='https://www.google.com/search?nfpr=1&q=%s+site:gnu.org/software/bash+|+site:gnu.org/s/bash'
  [bgg]='https://boardgamegeek.com/search/boardgame?q=%s'
  [boardgameforums]='https://www.google.com/search?nfpr=1&q=%s+site:boardgamegeek.com+|+site:reddit.com/r/boardgames'
  [boardgameoracle]='https://www.boardgameoracle.com/boardgame/search?q=%s'
  [camel]='https://camelcamelcamel.com/product/%s'
  [caniuse]='https://caniuse.com/?search=%s'
  [chewy]='https://www.chewy.com/s?query=%s'
  [chromewebstore]='https://chromewebstore.google.com/search/%s'
  [costco]='https://www.costco.com/s?keyword=%s'
  [debiandocs]='https://www.google.com/search?nfpr=1&q=%s+site:debian.org/doc+|+site:wiki.debian.org'
  [debianforums]='https://www.google.com/search?nfpr=1&q=%s+site:lists.debian.org+|+site:forums.debian.net+|+site:reddit.com/r/debian'
  [debianman]='https://dyn.manpages.debian.org/jump?suite=unstable&q=%s'
  [debianpackages]='https://packages.debian.org/search?keywords=%s'
  [debiansalsa]='https://www.google.com/search?nfpr=1&q=%s+site:salsa.debian.org'
  [ebay]='https://www.ebay.com/sch/i.html?_nkw=%s'
  [emacsdocs]='https://www.google.com/search?nfpr=1&q=%s+site:gnu.org/software/emacs+|+site:gnu.org/s/emacs+|+site:emacswiki.org+|+site:wikemacs.org+|+site:masteringemacs.org+|+site:emacsredux.com+|+site:xahlee.info'
  [emacsforums]='https://www.google.com/search?nfpr=1&q=%s+site:lists.gnu.org+|+site:reddit.com/r/emacs+|+site:emacs.stackexchange.com+|+site:forum.systemcrafters.net'
  [fedoradocs]='https://www.google.com/search?nfpr=1&q=%s+site:docs.fedoraproject.org+|+site:fedoraproject.org/wiki'
  [fedoraforums]='https://www.google.com/search?nfpr=1&q=%s+site:discussion.fedoraproject.org+|+site:ask.fedoraproject.org+|+site:lists.fedoraproject.org+|+site:reddit.com/r/Fedora+|+site:forums.fedoraforum.org'
  [fedorapackages]='https://packages.fedoraproject.org/search?query=%s'
  [firefoxaddons]='https://addons.mozilla.org/en-US/firefox/search/?type=extension&q=%s'
  [gitdocs]='https://www.google.com/search?nfpr=1&q=%s+site:git-scm.com+|+site:help.github.com+|+site:atlassian.com/git'
  [github]='https://github.com/search?type=Repositories&s=stars&q=%s'
  [githubsite]='https://www.google.com/search?nfpr=1&q=%s+site:github.com'
  [google]='https://www.google.com/search?nfpr=1&q=%s'
  [googleplay]='https://www.google.com/search?nfpr=1&q=%s+site:play.google.com/store/apps'
  [googleverbatim]='https://www.google.com/search?nfpr=1&tbs=li:1&q=%s'
  [hn]='https://hn.algolia.com/?type=all&sort=byDate&query=%s'
  [hntitles]='https://hn.algolia.com/?type=story&query=%s'
  [homedepot]='https://www.homedepot.com/s/%s'
  [indeed]='https://www.indeed.com/jobs?l=Remote&q=%s'
  [leanpub]='https://leanpub.com/bookstore?search=%s'
  [linkedin]='https://www.linkedin.com/jobs/search/?f_WT=2&keywords=%s'
  [linux]='https://www.google.com/search?nfpr=1&q=%s+"Linux"+|+"Arch+Linux"+|+"Debian"+|+"Fedora"+|+"RHEL"+|+"Ubuntu"'
  [linuxdocs]='https://www.google.com/search?nfpr=1&q=%s+site:wiki.alpinelinux.org+|+site:wiki.archlinux.org+|+site:debian.org/doc+|+site:wiki.debian.org+|+site:docs.fedoraproject.org+|+site:fedoraproject.org/wiki+|+site:developer.fedoraproject.org+|+site:wiki.gentoo.org+|+site:devmanual.gentoo.org+|+site:docs.kernel.org+|+site:wiki.manjaro.org+|+site:wiki.nixos.org+|+site:en.opensuse.org+|+site:docs.redhat.com+|+site:docs.rockylinux.org+|+site:documentation.suse.com+|+site:ubuntu.com/server+|+site:docs.voidlinux.org'
  [lobsters]='https://lobste.rs/search?what=comments&q=%s'
  [mdn]='https://www.google.com/search?nfpr=1&q=%s+site:developer.mozilla.org/en'
  [melpa]='https://melpa.org/#/?sort=downloads&asc=false&q=%s'
  [npm]='https://www.npmjs.com/search?q=%s'
  [npmgraph]='https://npmgraph.js.org/?q=%s'
  [onelook]='https://www.onelook.com/?ls=a&w=%s'
  [opensusesoftware]='https://software.opensuse.org/search?baseproject=openSUSE:Factory&q=%s'
  [oreilly]='https://www.oreilly.com/search/?type=book&language=en&order_by=published_at&rows=100&q=%s'
  [orgdocs]='https://www.google.com/search?nfpr=1&q=%s+site:orgmode.org'
  [pgdocs]='https://www.google.com/search?nfpr=1&q=%s+site:postgresql.org/docs'
  [reddit]='https://www.google.com/search?nfpr=1&q=%s+site:reddit.com'
  [redhatforums]='https://www.google.com/search?nfpr=1&q=%s+site:access.redhat.com/discussions+|+site:reddit.com/r/redhat'
  [repology]='https://repology.org/projects/?search=%s'
  [slickdeals]='https://slickdeals.net/newsearch.php?rating=0&sort=newest&q=%s'
  [target]='https://www.target.com/s?searchTerm=%s'
  [thesaurus]='https://thesaurus.com/browse/%s'
  [walmart]='https://www.walmart.com/search?query=%s'
  [wikipedia]='https://www.google.com/search?nfpr=1&q=%s+site:en.wikipedia.org'
  [youtube]='https://www.youtube.com/results?search_query=%s'
)

# Back up Web Data file.
cp -a "$web_data" "$web_data.bak"

# Remove all search shortcuts from Web Data file.
sqlite3 "$web_data" 'DELETE FROM keywords;'

# Import search shortcuts into Web Data file.
for key in "${!shortcuts[@]}"; do
  sqlite3 "$web_data" \
    "INSERT INTO keywords (short_name, keyword, favicon_url, url) \
     VALUES ('$key', '$key', '', '${shortcuts[$key]//%s/\{searchTerms\}}');"
done
