#!/bin/sh
# pywal2alacritty - get colors from Pywal and apply to Alacritty config
# v0.2.0
# github.com/egeesin
#
# Deps: grep, sed
# Usage: ./script.sh
#        ./script.sh <config toml>

# Function to display error and quit
die() {
  printf "ERR: %s\n" "$1" >&2
  exit 1
}

DEFAULT_MACOS_CONFIG="$HOME"/.config/alacritty/alacritty.toml

# Wal generates a shell script that defines color0..color15
SRC="$HOME"/.cache/wal/colors.sh

[ -e "$SRC" ] || die "Wal colors not found, exiting script. Have you executed Wal before?"
printf "Colors found, source ready.\n"

READLINK=$( command -v greadlink || command -v readlink )

# Get config file
if [ -n "$1" ]; then
  [ -e "$1" ] || die "Selected config doesn't exist, exiting script."
  printf "Config found, destination ready.\n"
  CFG=$1
  [ -L "$1" ] && {
    printf "Following symlink to config...\n"
    CFG=$($READLINK -f "$1")
  }
else
  # Default config path in Mac systems
  [ -e "$DEFAULT_MACOS_CONFIG" ] || die "Alacritty config not found, exiting script."

  CFG="$DEFAULT_MACOS_CONFIG"
  [ -L "$DEFAULT_MACOS_CONFIG" ] && {
    printf "Following symlink to config...\n"
    CFG=$($READLINK -f "$DEFAULT_MACOS_CONFIG")
  }
fi

# Get hex colors from Wal cache
# No need for shellcheck to check this, it comes from pywal
# shellcheck disable=SC1090
. "$SRC"

# Create temp file for sed results
tempfile=$(mktemp)
trap 'rm $tempfile' INT TERM EXIT

# Delete existing color declarations generated by this script
# If begin comment exists
if grep -q '^# BEGIN WAL' "$CFG"; then
  # And if end comment exists
  if grep -q '^# END WAL' "$CFG"; then
    # Delete contents of the block
    printf "Existing generated colors found, replacing new colors...\n"
    sed '/^# BEGIN WAL/,/^# END WAL/ {
      /^# BEGIN WAL/! { /^# END WAL/!d; }
    }' "$CFG" > "$tempfile" \
      && cat "$tempfile" > "$CFG"
  # If no end comment, don't do anything
  else
    die "No '# END WAL' comment found, please ensure it is present."
  fi
# If no begin comment found
else
  # Don't do anything and notify user if there's an end comment in the file
  ! grep -q '^# END WAL' "$CFG" || die "Found '# END WAL' comment, but no '# BEGIN WAL' comment found. Please ensure it is present."
  printf "There's no existing 'generated' colors, adding comments...\n";
  printf '# BEGIN WAL\n# END WAL' >> "$CFG";
fi

# Write new color definitions
# We know $colorX is unset, we set it by sourcing above
# shellcheck disable=SC2154
{ sed "/^# BEGIN WAL/ r /dev/stdin" "$CFG" > "$tempfile" <<EOF
[colors.primary]
background = '$color0'
foreground = '$color7'

[colors.cursor]
text   = '$color0' # Apply background color to color of text inside cursor
cursor = '$color7' # Apply foreground color to color of cursor

[colors.vi_mode_cursor]
text    = '$color0' # Same as above
cursor  = '$color7'

[colors.search.matches]
foreground = '$color0' # Same as above
background = '$color15' # Apply bright/white color to bg color of matching search

[colors.search.focused_match]
foreground = 'CellBackground'
background = 'CellForeground'

[colors.line_indicator]
foreground = 'None'
background = 'None'

[colors.footer_bar]
foreground = '$color8'
background = '$color7'

[colors.selection]
text       = 'CellBackground'
background = 'CellForeground'

[colors.normal]
black   = '$color0'
red     = '$color1'
green   = '$color2'
yellow  = '$color3'
blue    = '$color4'
magenta = '$color5'
cyan    = '$color6'
white   = '$color7'

[colors.bright]
black   = '$color8'
red     = '$color9'
green   = '$color10'
yellow  = '$color11'
blue    = '$color12'
magenta = '$color13'
cyan    = '$color14'
white   = '$color15'
EOF
} && cat "$tempfile" > "$CFG" \
  && rm "$tempfile"
trap - INT TERM EXIT
printf "'%s' exported to '%s'\n" "$SRC" "$CFG"
