#!/bin/bash

gen_index() {
    [ -f english.txt ] || \
        curl -fsSL https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt -o english.txt

    idx=0
    while IFS= read -r line; do
        bin=$(echo "obase=2;$idx" | bc)
        bin=$(printf "%011s" "$bin" | tr ' ' '0')

        dec=$(printf "%04d" $((idx + 1)))
        hex=$(printf "%03x" $((idx + 1)))

        printf "%s %s %s %s\n" "$bin" "$dec" "$hex" "$line"

        ((idx++))
    done < english.txt > english-index.txt
    rm english.txt
}

type="dec"
qr=0
rev=0
USAGE="Usage: $0 [-b|-h|-d|-w|-r] [-q] <input>"

[ -f english-index.txt ] || gen_index

while getopts "bhdwqr" opt; do
    case "$opt" in
        b) type="bin" ;;
        h) type="hex" ;;
        d) type="dec" ;;
        w) type="wrd" ;;
        r) rev=1 ;;
        q) qr=1 ;;
        *) echo "$USAGE"; exit 1 ;;
    esac
done

shift $((OPTIND-1))
input="$1"
buffer=""

if [ -z "$input" ]; then
    echo "$USAGE"
    exit 1
fi

case "$type" in
    bin) block=11; index_field=1 ;;
    dec) block=4;  index_field=2 ;;
    hex) block=3;  index_field=3 ;;
    wrd) block=4;  index_field=4 ;;
esac

if [ "$rev" -eq 1 ]; then
    read -ra arr <<< "$input"

    for element in "${arr[@]}"; do
        prefix="${element:0:4}"

        line=$(awk -v pfx="$prefix" '$4 ~ "^"pfx { print; exit }' english-index.txt)

        if [[ -n "$line" ]]; then
            field=$(echo "$line" | awk -v idx="$index_field" '{print $idx}')

            buffer+="${field:0:$block} "
        else
            echo "Unknow word: $element"
        fi
    done
else
    clean=$(echo "$input" | tr -cd '[:alnum:]')

    for ((i=0; i<${#clean}; i+=block)); do
        key="${clean:i:block}"

        word=$(awk -v k="$key" -v f="$index_field" -v b="$block" '{
            prefix = substr($f, 1, b)
            if (prefix == k) {print $4; exit}
        }' english-index.txt)

        if [ -n "$word" ]; then
            buffer+="$word "
        fi
    done
fi

if [ "$qr" -eq 1 ]; then
    qrencode -t ansiutf8 "$buffer"
fi

echo "$buffer"
