#!/usr/bin/env bash
set -euo pipefail

if [[ $# -ne 2 ]]; then
    echo "Usage: $0 <source.psfu.gz> <output.psfu>"
    echo
    echo "Example:"
    echo "  $0 spleen-12x24.psfu.gz spleen-10x20.psfu"
    exit 1
fi

SRC="$1"
OUT="$2"

TMP="$(mktemp -d)"

cleanup() {
    rm -rf "$TMP"
}
trap cleanup EXIT

if [[ ! -f "$SRC" ]]; then
    echo "Fehler: Quelldatei nicht gefunden:"
    echo "  $SRC"
    exit 1
fi

for cmd in psf2bdf bdf2psf; do
    if ! command -v "$cmd" >/dev/null 2>&1; then
        echo "Fehler: '$cmd' wurde nicht gefunden."
        exit 1
    fi
done

echo "==> Entpacke $SRC ..."
gzip -dc "$SRC" > "$TMP/source.psf"

echo "==> Konvertiere PSF -> BDF ..."
psf2bdf --iso10646 \
    "$TMP/source.psf" \
    "$TMP/source.bdf"

echo "==> Erzeuge 10x20-BDF ..."

awk '
function hex2dec(h,    i,c,n,v) {
    n = 0

    for (i = 1; i <= length(h); i++) {
        c = substr(h,i,1)

        if (c >= "0" && c <= "9")
            v = c - "0"
        else if (c >= "A" && c <= "F")
            v = index("ABCDEF",c) + 9
        else
            v = index("abcdef",c) + 9

        n = n * 16 + v
    }

    return n
}

/^FONTBOUNDINGBOX/ {
    print "FONTBOUNDINGBOX 10 20 0 -4"
    next
}

/^BBX / {
    print "BBX 10 20 0 -4"
    next
}

/^BITMAP$/ {
    print
    in_bitmap = 1
    row = 0
    next
}

/^ENDCHAR$/ {
    in_bitmap = 0
    print
    next
}

{
    if (!in_bitmap) {
        print
        next
    }

    value = hex2dec($0)
    result = 0

    # 12x24 -> 10x20
    #
    # Horizontal: 12 -> 10 Pixel
    # Vertical:   24 -> 20 Pixel

    src_y = int(row * 24 / 20)

    for (x = 0; x < 10; x++) {
        src_x = int(x * 12 / 10)

        bit = and(value, lshift(1, 11 - src_x))

        if (bit)
            result = or(result, lshift(1, 9 - x))
    }

    printf "%03X\n", result

    row++

    next
}
' "$TMP/source.bdf" > "$TMP/output.bdf"

echo "==> Konvertiere BDF -> PSF ..."

EQUIV="/usr/share/bdf2psf/standard.equivalents"
FONTSET="/usr/share/bdf2psf/fontsets/Uni2.512"

if [[ ! -f "$EQUIV" ]]; then
    echo "Fehler: $EQUIV nicht gefunden."
    exit 1
fi

if [[ ! -f "$FONTSET" ]]; then
    echo "Fehler: $FONTSET nicht gefunden."
    exit 1
fi

bdf2psf \
    "$TMP/output.bdf" \
    "$EQUIV" \
    "$FONTSET" \
    512 \
    "$TMP/output.psf"

echo "==> Schreibe $OUT ..."

mkdir -p "$(dirname "$OUT")"

install -m 644 \
    "$TMP/output.psf" \
    "$OUT"

echo
echo "Fertig:"
echo "  $OUT"
echo
echo "Testen mit:"
echo "  setfont $OUT"
