#!/usr/bin/env bash
cd $(dirname $0)/..

PROTOB=common/protob

CORE_PROTOBUF_SOURCES="\
    $PROTOB/messages.proto \
    $PROTOB/messages-binance.proto \
    $PROTOB/messages-bitcoin.proto \
    $PROTOB/messages-cardano.proto \
    $PROTOB/messages-common.proto \
    $PROTOB/messages-crypto.proto \
    $PROTOB/messages-debug.proto \
    $PROTOB/messages-eos.proto \
    $PROTOB/messages-ethereum.proto \
    $PROTOB/messages-lisk.proto \
    $PROTOB/messages-management.proto \
    $PROTOB/messages-monero.proto \
    $PROTOB/messages-nem.proto \
    $PROTOB/messages-ripple.proto \
    $PROTOB/messages-stellar.proto \
    $PROTOB/messages-tezos.proto \
    $PROTOB/messages-webauthn.proto \
"

PYTHON_PROTOBUF_SOURCES=$PROTOB/*.proto

CORE_MESSAGES_IGNORE="\
    CosiCommit \
    CosiCommitment \
    CosiSign \
    CosiSignature \
    DebugLinkFlashErase \
    DebugLinkLog \
    DebugLinkMemory \
    DebugLinkMemoryRead \
    DebugLinkMemoryWrite \
    DebugLinkStop \
    NEMDecryptMessage \
    NEMDecryptedMessage \
    PinMatrixAck \
    PinMatrixRequest \
    PinMatrixRequestType \
    WordAck \
    WordRequest \
    WordRequestType \
"

PYTHON_MESSAGES_IGNORE=""

RETURN=0

do_rebuild() {
    # rebuild protobuf in specified directory
    local DESTDIR="$1"
    shift
    local SOURCES="$1"
    shift
    local IGNORE="$1"
    shift
    local APPLY_BITCOIN_ONLY="$1"
    shift

    mkdir -p "$DESTDIR"
    rm -f "$DESTDIR"/[A-Z]*.py

    # note $SOURCES is unquoted - we want wildcard expansion and multiple args
    $PROTOB/pb2py "$@" -o "$DESTDIR" $SOURCES

    # TODO: make this less hackish
    # maybe introduce attribute "altcoin" in protobuf?
    if [ "$APPLY_BITCOIN_ONLY" == "TRUE" ]; then
        sed -i "3ifrom trezor import utils\n" "$DESTDIR"/Capability.py
        sed -i "3ifrom trezor import utils\n" "$DESTDIR"/MessageType.py
        sed -i "/^EthereumGetPublicKey/iif not utils.BITCOIN_ONLY:" "$DESTDIR"/MessageType.py
        for altcoin in Ethereum NEM Lisk Tezos Stellar Cardano Ripple Monero DebugMonero Eos Binance WebAuthn; do
            sed -i "s:^$altcoin:    $altcoin:" "$DESTDIR"/Capability.py
            sed -i "s:^$altcoin:    $altcoin:" "$DESTDIR"/MessageType.py
        done
        sed -i "/^Bitcoin_like/iif not utils.BITCOIN_ONLY:" "$DESTDIR"/Capability.py
        sed -i "/^EOS/iif not utils.BITCOIN_ONLY:" "$DESTDIR"/Capability.py
        for feature in Bitcoin_like EOS U2F; do
            sed -i "s:^$feature:    $feature:" "$DESTDIR"/Capability.py
        done
    fi
    # ENDTODO

    # delete unused messages
    for F in $IGNORE; do
        rm -f "$DESTDIR"/"$F".py
    done
}

do_check() {
    # rebuild protobuf in tmpdir and check result against specified directory
    local TMPDIR=$(mktemp -d proto-check.XXXXXX)
    local DESTDIR="$1"
    shift

    cp -rT "$DESTDIR" "$TMPDIR"
    do_rebuild "$TMPDIR" "$@"
    DIFF=$(diff -ur "$DESTDIR" "$TMPDIR")
    rm -r "$TMPDIR"
    if [ -n "$DIFF" ]; then
        echo "$DIFF"
        RETURN=1
    fi
}

if [ "$1" == "--check" ]; then
    func=do_check
else
    func=do_rebuild
fi

$func core/src/trezor/messages "$CORE_PROTOBUF_SOURCES" "$CORE_MESSAGES_IGNORE" TRUE --no-init-py
$func python/src/trezorlib/messages "$PYTHON_PROTOBUF_SOURCES" "$PYTHON_MESSAGES_IGNORE" FALSE -P ..protobuf

exit $RETURN