#!/usr/bin/env bash
# Fake mysql client: state under $FAKE (users/<u> = "host pw" lines, grants/<u>).
set -euo pipefail
printf '%s\n' "$*" >> "$FAKE/argv"
cnf=""
while [ $# -gt 0 ]; do
    case "$1" in --defaults-file=*) cnf="${1#--defaults-file=}" ;; esac; shift
done
mkdir -p "$FAKE/users" "$FAKE/grants"
if [ "$cnf" != "$FAKE_ROOT_CNF" ]; then # an account's own login: password must match
    u="$(sed -n 's/^user=//p' "$cnf")"; p="$(sed -n 's/^password=//p' "$cnf")"
    grep -qx -- "$FAKE_GW $p" "$FAKE/users/$u" 2>/dev/null || exit 1
    exit 0
fi
while IFS= read -r line; do
    [ -n "$line" ] || continue
    echo "$line" | sed -E "s/(IDENTIFIED BY|PASSWORD) '[^']*'/\1 '<pw>'/" >> "$FAKE/log"
    if [[ "$line" =~ ^SELECT\ Host\ FROM\ mysql.user\ WHERE\ User=\'([^\']+)\'\;$ ]]; then
        u="${BASH_REMATCH[1]}"; [ -f "$FAKE/users/$u" ] && cut -d' ' -f1 "$FAKE/users/$u"; true
    elif [[ "$line" =~ ^CREATE\ USER\ \'([^\']+)\'@\'([^\']+)\'\ IDENTIFIED\ BY\ \'([^\']+)\'\;$ ]]; then
        echo "${BASH_REMATCH[2]} ${BASH_REMATCH[3]}" >> "$FAKE/users/${BASH_REMATCH[1]}"
    elif [[ "$line" =~ ^ALTER\ USER\ \'([^\']+)\'@\'([^\']+)\'\ IDENTIFIED\ BY\ \'([^\']+)\'\;$ ]]; then
        u="${BASH_REMATCH[1]}"; h="${BASH_REMATCH[2]}"
        grep -v "^$h " "$FAKE/users/$u" > "$FAKE/tmp" || true; echo "$h ${BASH_REMATCH[3]}" >> "$FAKE/tmp"; mv "$FAKE/tmp" "$FAKE/users/$u"
    elif [[ "$line" =~ ^DROP\ USER\ \'([^\']+)\'@\'([^\']+)\'\;$ ]]; then
        grep -v "^${BASH_REMATCH[2]} " "$FAKE/users/${BASH_REMATCH[1]}" > "$FAKE/tmp" || true; mv "$FAKE/tmp" "$FAKE/users/${BASH_REMATCH[1]}"
    elif [[ "$line" =~ ^GRANT\ (.+)\ ON\ (.+)\ TO\ \'([^\']+)\'@\'([^\']+)\'\;$ ]]; then
        g="GRANT ${BASH_REMATCH[1]} ON ${BASH_REMATCH[2]} TO \`${BASH_REMATCH[3]}\`@\`${BASH_REMATCH[4]}\`"
        touch "$FAKE/grants/${BASH_REMATCH[3]}"; grep -qxF -- "$g" "$FAKE/grants/${BASH_REMATCH[3]}" || echo "$g" >> "$FAKE/grants/${BASH_REMATCH[3]}"
    elif [[ "$line" =~ ^SHOW\ GRANTS\ FOR\ \'([^\']+)\'@\'([^\']+)\'\;$ ]]; then
        echo "GRANT USAGE ON *.* TO \`${BASH_REMATCH[1]}\`@\`${BASH_REMATCH[2]}\` IDENTIFIED BY PASSWORD '*ABC'"
        cat "$FAKE/grants/${BASH_REMATCH[1]}" 2>/dev/null || true
        cat "$FAKE/extra_grants" 2>/dev/null || true
    else
        echo "fake mysql: unknown statement: $line" >&2; exit 1
    fi
done
