#!/usr/bin/env bash

# This script turns many *.sql.go files into a single queries.sql.go file. This
# is due to sqlc's behavior when using multiple sql files to output them to
# multiple Go files. We decided it would be cleaner to move these to a single
# file for readability. We should probably contribute the option to do this
# upstream instead, because this is quite janky.

set -euo pipefail

SCRIPT_DIR=$(dirname "${BASH_SOURCE[0]}")

(
	cd "$SCRIPT_DIR"

	echo generate 1>&2

	# Dump the updated schema (use make to utilize caching).
	make -C ../.. --no-print-directory coderd/database/dump.sql
	# The logic below depends on the exact version being correct :(
	sqlc generate

	first=true
	files=$(find ./queries/ -type f -name "*.sql.go" | LC_ALL=C sort)
	for fi in $files; do
		# Find the last line from the imports section and add 1. We have to
		# disable pipefail temporarily to avoid ERRPIPE errors when piping into
		# `head -n1`.
		set +o pipefail
		cut=$(grep -n ')' "$fi" | head -n 1 | cut -d: -f1)
		set -o pipefail
		cut=$((cut + 1))

		# Copy the header from the first file only, ignoring the source comment.
		if $first; then
			head -n 6 <"$fi" | grep -v "source" >queries.sql.go
			first=false
		fi

		# Append the file past the imports section into queries.sql.go.
		tail -n "+$cut" <"$fi" >>queries.sql.go
	done

	# Move the files we want.
	mv queries/querier.go .
	mv queries/models.go .

	# Remove temporary go files.
	rm -f queries/*.go

	# Fix struct/interface names.
	gofmt -w -r 'Querier -> sqlcQuerier' -- *.go
	gofmt -w -r 'Queries -> sqlQuerier' -- *.go

	# Ensure correct imports exist. Modules must all be downloaded so we get correct
	# suggestions.
	go mod download
	go run golang.org/x/tools/cmd/goimports@latest -w queries.sql.go

	go run ../../scripts/dbgen
	# This will error if a view is broken. This is in it's own package to avoid
	# stuff like dbmock breaking builds if it's out of date from the interface.
	go test ./gentest
)
