#!/bin/bash
# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

set -e

if [[ ! -d "${FUCHSIA_BUILD_DIR}" ]]; then
  echo "FUCHSIA_BUILD_DIR environment variable not a directory; are you running under fx exec?" 1>&2
  exit 1
fi

BANJO_DIR="$FUCHSIA_DIR/src/devices/tools/fidlgen_banjo/"
FIDL_IR_FILE="${FUCHSIA_BUILD_DIR}/fildgen_banjo_test_ir.json"
FIDL_FILES="$BANJO_DIR/tests/fidl"
C_FILES="$BANJO_DIR/tests/c"
CPP_FILES="$BANJO_DIR/tests/cpp"
RUST_FILES="$BANJO_DIR/tests/rust"
AST_FILES="$BANJO_DIR/tests/ast"
FIDLGEN_BANJO="$FUCHSIA_BUILD_DIR/host_x64/exe.unstripped/fidlgen_banjo"
FIDLC="$FUCHSIA_BUILD_DIR/host_x64/exe.unstripped/fidlc"

FILE="$1"

for f in $FIDL_FILES/*
do
  filename=$(basename -- "$f")
  extension="${filename##*.*.}"
  filename="${filename%.*.*}"

  if [ ! -z  "$FILE" ] && [ "$filename" != "$FILE" ]; then
    continue
  fi

  if [ "$extension" != "fidl" ]; then
    continue
  fi

  if [ "$filename" = "badtype" ]; then
    continue
  fi

  if [ "$filename" = "librarypart_two" ]; then
    continue
  fi

  dependencies=""
  with_c=true
  with_cpp=true
  with_cpp_mock=false
  with_rust=true

  if [ "$filename" = "callback" ] || [ "$filename" = "simple" ] || [ "$filename" = "interface" ] \
    || [ "$filename" = "protocolbase" ] || [ "$filename" = "api" ] \
    || [ "$filename" = "passcallback" ] || [ "$filename" = "fidlhandle" ] \
    || [ "$filename" = "handles" ] || [ "$filename" = "protocolarray" ] \
    || [ "$filename" = "protocolvector" ] || [ "$filename" = "tables" ] \
    || [ "$filename" = "example9" ] || [ "$filename" = "protocolhandle" ] \
    || [ "$filename" = "types" ] || [ "$filename" = "order4" ] || [ "$filename" = "order5" ]; then
    dependencies="$dependencies --files $FUCHSIA_DIR/zircon/vdso/rights.fidl $FUCHSIA_DIR/zircon/vdso/zx_common.fidl"
  fi

  if [ "$filename" = "order6" ]; then
    dependencies="$dependencies --files $FIDL_FILES/order7.test.fidl"
  fi

  if [ "$filename" = "view" ]; then
    dependencies="$dependencies --files $FIDL_FILES/point.test.fidl"
  fi

  if [ "$filename" = "callback" ]; then
    dependencies="$dependencies --files $FIDL_FILES/callback2.test.fidl"
  fi

  if [ "$filename" = "enums" ] || [ "$filename" = "bits" ] || [ "$filename" = "types" ] \
    || [ "$filename" = "example0" ] || [ "$filename" = "example1" ] \
    || [ "$filename" = "example2" ] || [ "$filename" = "example3" ] \
    || [ "$filename" = "alignment" ]  || [ "$filename" = "example8" ] || [ "$filename" = "point" ] \
    || [ "$filename" = "tables" ]; then
    with_cpp=false
  fi

  if [ "$filename" = "passcallback" ] || [ "$filename" = "protocolarray" ] \
    || [ "$filename" = "protocolbase" ] || [ "$filename" = "protocolhandle" ] \
    || [ "$filename" = "protocolothertypes" ] || [ "$filename" = "protocolprimitive" ] \
    || [ "$filename" = "protocolvector" ] || [ "$filename" = "interface" ]; then
    with_cpp_mock=true
  fi

  if [ "$filename" = "rustderive" ]; then
    with_c=false
    with_cpp=false
  fi

  if [ "$filename" = "parameterattributes" ]; then
    with_rust=false
    with_c=false
    with_cpp=false
  fi

  if [ "$filename" = "handles" ]; then
    with_rust=false
  fi

  if [ "$filename" = "constants" ] || [ "$filename" = "order" ] || [ "$filename" = "union" ] \
    || [ "$filename" = "order1" ] || [ "$filename" = "order2" ] || [ "$filename" = "order3" ] \
    || [ "$filename" = "order4" ] || [ "$filename" = "order5" ] || [ "$filename" = "order6" ] \
    || [ "$filename" = "order7" ]; then
    with_cpp=false
    with_rust=false
  fi

  echo "Regenerating $filename"
  $FIDLC --json "${FIDL_IR_FILE}" $dependencies --files $f
  if [ $with_c = true ]; then
    $FIDLGEN_BANJO --backend C --output "$C_FILES/$filename.h" --ir "${FIDL_IR_FILE}"
  fi
  if [ $with_cpp = true ]; then
    $FIDLGEN_BANJO --backend cpp --output "$CPP_FILES/$filename.h" --ir "${FIDL_IR_FILE}"
    $FIDLGEN_BANJO --backend cpp_internal --output "$CPP_FILES/$filename-internal.h" --ir "${FIDL_IR_FILE}"
  fi
  if [ $with_cpp_mock = true ]; then
    $FIDLGEN_BANJO --backend cpp_mock --output "$CPP_FILES/mock-$filename.h" --ir "${FIDL_IR_FILE}"
  fi
  if [ $with_rust = true ]; then
    $FIDLGEN_BANJO --backend rust --output "$RUST_FILES/$filename.rs" --ir "${FIDL_IR_FILE}"
  fi
done
