#!/usr/bin/env bash

set -e
set -o pipefail

FAILED=0

fail() {
    echo "$1"
    echo ""
    if [ "$CI" = "true" ]; then
        FAILED=1
    else
        exit 1
    fi
}

rm -rf tmp
mkdir -p tmp

for i in tests/*; do
    i=$(basename "$i")
    TEST_DIR="tests/$i"
    TMP_DIR="tmp/$i"

    echo "Testing $i"

    if [ -f "$TEST_DIR/skip_extract" ]; then
        echo "Skipping $i"
        echo ""
        continue
    fi

    mkdir -p "$TMP_DIR/a" "$TMP_DIR/b"

    ret=0

    if [[ ! -f "$TEST_DIR/expected.txt" ]]; then
        fail "Missing expected.txt"
        continue
    fi

    if [[ ! -f "$TEST_DIR/flags.txt" ]]; then
        fail "Missing flags.txt"
        continue
    fi

    ./aastuff -i "tests/$i/encrypted.aea" -o "tmp/$i/a" --key "$(cat "$TEST_DIR"/expected.txt)" || ret=$?
    if [ $ret -ne 0 ]; then
        fail "aastuff failed with $ret"
        continue
    fi

    ./aastuff_standalone -i "tests/$i/encrypted.aea" -o "tmp/$i/b" --key "$(cat "$TEST_DIR"/expected.txt)" || ret=$?
    if [ $ret -ne 0 ]; then
        fail "aastuff_standalone failed with $ret"
        continue
    fi

    diff -r "$TMP_DIR/a" "$TMP_DIR/b" || ret=$?
    if [ $ret -eq 0 ]; then
        echo "Diff passed"
    else
        fail "Diff failed"
        continue
    fi

    aa archive -d "tmp/$i/a" -o "tmp/$i/a.aar" -exclude-field all -include-field "$(cat tests/"$i"/flags.txt)" || ret=$?
    if [ $ret -ne 0 ]; then
        fail "Archive creation failed with $ret"
        continue
    fi

    aa verify -i "tmp/$i/a.aar" -d "tmp/$i/b" || ret=$?
    if [ $ret -eq 0 ]; then
        echo "Verify passed"
    else
        fail "Verify failed"
        continue
    fi

    echo "Test $i passed"
    echo ""
done

rm -rf tmp
echo Done

if [ $FAILED -ne 0 ]; then
    echo "Some tests failed"
    exit 1
fi