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

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
API_DIR="${SCRIPT_DIR}/.."

TMP_DIR="$(mktemp -d)"
trap "rm -rf ${TMP_DIR}" EXIT
GEN_FILES=()

echo "Validating generated code..."
echo "Separating generated files from handwritten files..."
while IFS= read -r file; do
	GEN_FILES+=("$file")
done < <(grep -rl "// Code generated" "${API_DIR}/types" || true)

echo "Copying generated files into temporary folder..."
for f in "${GEN_FILES[@]}"; do
	mkdir -p "${TMP_DIR}/$(dirname "${f#${API_DIR}/}")"
	cp "$f" "${TMP_DIR}/${f#${API_DIR}/}"
done

cp "${API_DIR}/swagger.yaml" "${TMP_DIR}/"
cp "${API_DIR}/swagger-gen.yaml" "${TMP_DIR}/"
cp -r "${API_DIR}/templates" "${TMP_DIR}/" 2> /dev/null || true

echo "Generating swagger types in temporary folder..."
(
	cd "${TMP_DIR}"
	"${SCRIPT_DIR}/generate-swagger-api.sh" > /dev/null 2>&1
)

echo "Run diff for all generated files..."
DIFF_FOUND=false
for f in "${GEN_FILES[@]}"; do
	REL="${f#${API_DIR}/}"
	if ! diff -q "${TMP_DIR}/${REL}" "${API_DIR}/${REL}" > /dev/null 2>&1; then
		echo "Difference found in ${REL}"
		diff -u "${TMP_DIR}/${REL}" "${API_DIR}/${REL}" || true
		DIFF_FOUND=true
	fi
done

if [ "$DIFF_FOUND" = true ]; then
	echo
	echo "Swagger validation failed. Please run:"
	echo "  ./scripts/generate-swagger-api.sh"
	echo "and commit updated generated files."
	exit 1
fi

echo "Swagger file is up to date."