#!/bin/bash

DEST=$2
PACKAGE=$3
TMPFILE="mockgen_tmp.go"
# uppercase the name of the interface
ORIG_INTERFACE_NAME=$4
INTERFACE_NAME="$(tr '[:lower:]' '[:upper:]' <<< ${ORIG_INTERFACE_NAME:0:1})${ORIG_INTERFACE_NAME:1}"

# Gather all files that contain interface definitions.
# These interfaces might be used as embedded interfaces,
# so we need to pass them to mockgen as aux_files.
AUX=()
for f in *.go; do
  if [[ -z ${f##*_test.go} ]]; then
    # skip test files
    continue;
  fi
  if $(egrep -qe "type (.*) interface" $f); then
    AUX+=("github.com/lucas-clemente/quic-go=$f")
  fi
done

# Find the file that defines the interface we're mocking.
for f in *.go; do
  if [[ -z ${f##*_test.go} ]]; then
    # skip test files
    continue;
  fi
  INTERFACE=$(sed -n "/^type $ORIG_INTERFACE_NAME interface/,/^}/p" $f)
  if [[ -n "$INTERFACE" ]]; then
    SRC=$f
    break
  fi
done

if [[ -z "$INTERFACE" ]]; then
  echo "Interface $ORIG_INTERFACE_NAME not found."
  exit 1
fi

AUX_FILES=$(IFS=, ; echo "${AUX[*]}")

## create a public alias for the interface, so that mockgen can process it
echo -e "package $1\n" > $TMPFILE
echo "$INTERFACE" | sed "s/$ORIG_INTERFACE_NAME/$INTERFACE_NAME/" >> $TMPFILE
mockgen -package $1 -self_package $3 -destination $DEST -source=$TMPFILE -aux_files $AUX_FILES
sed "s/$TMPFILE/$SRC/" "$DEST" > "$DEST.new" && mv "$DEST.new" "$DEST"
rm "$TMPFILE"