DOCKER_EXE ?= docker
DOCKER_NAME ?= accelforge
DOCKER_BUILD ?= ${DOCKER_EXE} buildx build --load --pull

VERSION := 0.1.5

USER    := timeloopaccelergy
REPO    := accelforge
INFRA_REPO := accelforge-extra

NAME    := ${USER}/${REPO}
TAG     := $$(git log -1 --pretty=%h)
IMG     := ${NAME}:${TAG}

ALTTAG  := latest
ALTIMG  := ${NAME}:${ALTTAG}

INFRA_NAME    := ${USER}/${INFRA_REPO}
INFRA_IMG     := ${INFRA_NAME}:${TAG}
INFRA_ALTIMG  := ${INFRA_NAME}:${ALTTAG}

# Install hwcomponents packages from PyPI for Docker builds.
.PHONY: install-hwcomponents
install-hwcomponents:
	python3 -m pip install --no-cache-dir hwcomponents hwcomponents-adc hwcomponents-cacti hwcomponents-library hwcomponents-neurosim

# Login to docker hub
login:
	"${DOCKER_EXE}" login --username ${DOCKER_NAME} --password ${DOCKER_PASS}

# Build and tag docker image
build-amd64:
	${DOCKER_BUILD} ${BUILD_FLAGS} --platform linux/amd64 \
          --build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \
          --build-arg VCS_REF=${TAG} \
          --build-arg BUILD_VERSION=${VERSION} \
          -t ${IMG}-amd64 \
          -t ${ALTIMG}-amd64 .

build-extra-amd64:
	${DOCKER_BUILD} ${BUILD_FLAGS} --platform linux/amd64 \
          -f infrastructure/Dockerfile \
          -t ${INFRA_IMG}-amd64 \
          -t ${INFRA_ALTIMG}-amd64 .

build-arm64:
	${DOCKER_BUILD} ${BUILD_FLAGS} --platform linux/arm64 \
          --build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \
          --build-arg VCS_REF=${TAG} \
          --build-arg BUILD_VERSION=${VERSION} \
          -t ${IMG}-arm64 \
          -t ${ALTIMG}-arm64 .

build-extra-arm64:
	${DOCKER_BUILD} ${BUILD_FLAGS} --platform linux/arm64 \
          -f infrastructure/Dockerfile \
          -t ${INFRA_IMG}-arm64 \
          -t ${INFRA_ALTIMG}-arm64 .

# Push docker image
push-amd64:
	@echo "Pushing ${NAME}:${ALTTAG}-amd64"
	#Push Amd64 version
	"${DOCKER_EXE}" push ${NAME}:${ALTTAG}-amd64
	#Combine Amd64 version into multi-architecture docker image.
	"${DOCKER_EXE}" manifest rm ${NAME}:${ALTTAG} || true
	"${DOCKER_EXE}" manifest create \
		${NAME}:${ALTTAG} \
		${NAME}:${ALTTAG}-amd64 \
		${NAME}:${ALTTAG}-arm64
	"${DOCKER_EXE}" manifest push ${NAME}:${ALTTAG}
	@echo "Pushing ${INFRA_NAME}:${ALTTAG}-amd64"


push-extra-amd64:
	@echo "Pushing ${INFRA_NAME}:${ALTTAG}-amd64"
	"${DOCKER_EXE}" push ${INFRA_NAME}:${ALTTAG}-amd64
	#Combine Amd64 infrastructure version into multi-architecture docker image.
	"${DOCKER_EXE}" manifest rm ${INFRA_NAME}:${ALTTAG} || true
	"${DOCKER_EXE}" manifest create \
		${INFRA_NAME}:${ALTTAG} \
		${INFRA_NAME}:${ALTTAG}-amd64 \
		${INFRA_NAME}:${ALTTAG}-arm64
	"${DOCKER_EXE}" manifest push ${INFRA_NAME}:${ALTTAG}

push-arm64:
	@echo "Pushing ${NAME}:${ALTTAG}-arm64"
	#Push Arm64 version
	"${DOCKER_EXE}" push ${NAME}:${ALTTAG}-arm64
	#Combine Arm64 version into multi-architecture docker image.
	"${DOCKER_EXE}" manifest rm ${NAME}:${ALTTAG} || true
	"${DOCKER_EXE}" manifest create \
		${NAME}:${ALTTAG} \
		${NAME}:${ALTTAG}-amd64 \
		${NAME}:${ALTTAG}-arm64
	"${DOCKER_EXE}" manifest push ${NAME}:${ALTTAG}

push-extra-arm64:
	@echo "Pushing ${INFRA_NAME}:${ALTTAG}-arm64"
	#Push Arm64 infrastructure version
	"${DOCKER_EXE}" push ${INFRA_NAME}:${ALTTAG}-arm64
	#Combine Arm64 infrastructure version into multi-architecture docker image.
	"${DOCKER_EXE}" manifest rm ${INFRA_NAME}:${ALTTAG} || true
	"${DOCKER_EXE}" manifest create \
		${INFRA_NAME}:${ALTTAG} \
		${INFRA_NAME}:${ALTTAG}-amd64 \
		${INFRA_NAME}:${ALTTAG}-arm64
	"${DOCKER_EXE}" manifest push ${INFRA_NAME}:${ALTTAG}

all-infra:
	make build-arm64
	make build-amd64
	make push-arm64
	make push-amd64
	make build-extra-arm64
	make build-extra-amd64
	make push-extra-arm64
	make push-extra-amd64

run-docker:
	docker-compose up

clean-notebooks:
	nb-clean clean notebooks/*.ipynb

.PHONY: generate-docs
generate-docs:
    # pip install sphinx-autobuild sphinx_autodoc_typehints sphinx-copybutton pydata-sphinx-theme
	rm -r docs/_build/html
	rm docs/source/accelforge.*.rst
	LC_ALL=C.UTF-8 LANG=C.UTF-8 sphinx-apidoc -f -o docs/source/ --tocfile accelforge accelforge
	LC_ALL=C.UTF-8 LANG=C.UTF-8 sphinx-autobuild -a docs/source docs/_build/html
