# RedPitaya FPGA アイスレーダシステム - 統合Makefile

-include deploy.dev.env
-include deploy.prod.env

# SSH接続設定（必要に応じて `make RP_HOST_NAME=...` のように上書き可能）
RP_HOST_NAME ?= rp-ffff18.local
# RP_HOST_NAME ?= rp-f0c5a7.local
RP_USER ?= root
HOST_IDENTIFY_FILE ?= ~/.ssh/id_rsa

# プロジェクトディレクトリ（RedPitaya上）
REMOTE_DIR ?= /root/rp-fpga-project

# ローカルディレクトリ
LOCAL_DIR = redpitaya

.PHONY: help deploy download clean clean-remote build-webui run-webui run dist dist-dev dist-prod dist-deb dist-deb-dev dist-deb-prod \
        dist-zip dist-zip-dev dist-zip-prod \
        docs-serve docs-build docs-build-dev docs-build-prod \
        docs-deploy-dev docs-deploy-prod deploy-docs deploy-docs-dev deploy-docs-prod update-docs update-docs-dev update-docs-prod \
        deploy-dev deploy-prod dist-deploy-dev dist-deploy-prod \
        check-deploy-dev-env check-deploy-prod-env upload-bitstream-dev upload-bitstream-prod \
        prepare-dist-downloads ensure-remote-dir-dev ensure-remote-dir-prod

# ヘルプ表示
help:
	@echo "RedPitaya FPGA System - Makefile"
	@echo ""
	@echo "Usage:"
	@echo "  make deploy RP_HOST_NAME=rp-exmaple.local RP_USER=root"
	@echo "  make download"
	@echo "  make clean                 (clean local build artifacts)"
	@echo "  make clean-remote RP_HOST_NAME=rp-exmaple.local RP_USER=root"
	@echo "  make build-webui"
	@echo "  make run-webui"
	@echo "  make run                   (build + run in foreground)"
	@echo "  make dist                  (build all distribution packages)"
	@echo "  make dist-deb              (build .deb package for Linux)"
	@echo "  make docs-serve            (serve MkDocs documentation locally via Docker)"
	@echo "  make docs-build            (build MkDocs static site via Docker)"
	@echo "  make deploy-docs-dev       (build & deploy documentation only to DEV Server)"
	@echo "  make deploy-docs-prod      (build & deploy documentation only to PROD Server)"
	@echo "  make deploy-dev            (build packages & docs, deploy ALL to DEV LAN Server)"
	@echo "  make deploy-prod           (build packages & docs, deploy ALL to PROD VPS)"
	@echo "  make upload-bitstream-dev  (upload bitstreams to DEV LAN Server)"
	@echo "  make upload-bitstream-prod (upload bitstreams to PROD VPS)"

deploy:
	@echo "=== Deploying to $(RP_HOST_NAME) ==="
	@echo "Checking for updated bitstreams..."
	@./scripts/download_bitstream.sh || echo "※ インターネット非接続のためビットストリームの最新化をスキップし、現在のファイルでデプロイします。"
	@echo "Testing SSH connection..."
	@ssh $(RP_USER)@$(RP_HOST_NAME) 'echo "✓ SSH connection successful"'
	
	@echo "Creating remote directory..."
	@ssh $(RP_USER)@$(RP_HOST_NAME) 'mkdir -p $(REMOTE_DIR)'
	@ssh $(RP_USER)@$(RP_HOST_NAME) 'mkdir -p $(REMOTE_DIR)/scripts'

	@echo "Transferring redpitaya directory..."
	@scp -r $(LOCAL_DIR)/* $(RP_USER)@$(RP_HOST_NAME):$(REMOTE_DIR)/

	@echo "Syncing helper scripts..."
	@scp scripts/tx_asg.py scripts/stop_asg_output.py $(RP_USER)@$(RP_HOST_NAME):$(REMOTE_DIR)/scripts/

	@echo "Compiling on RedPitaya..."
	@ssh $(RP_USER)@$(RP_HOST_NAME) 'cd $(REMOTE_DIR) && make clean && make'
	
	@echo ""
	@echo "=== Deploy completed successfully ==="

download:
	@echo "Downloading bitstreams..."
	@./scripts/download_bitstream.sh


# ローカルクリーンアップ
clean:
	@echo "Cleaning local build artifacts..."
	rm -rf dist_out dist_deb_tmp dist_zip_tmp build site/downloads site/bitstreams iceradar-webui
	@echo "✓ Cleaned local build artifacts"

# リモートクリーンアップ
clean-remote:
	@echo "Cleaning remote files on $(RP_HOST_NAME)..."
	@ssh $(RP_USER)@$(RP_HOST_NAME) 'cd $(REMOTE_DIR) && make clean 2>/dev/null'
	@echo "✓ Remote cleanup completed"

# Web UI ビルド
build-webui:
	@echo "Building Web UI..."
	go build -ldflags "-X main.Version=$$(cat VERSION 2>/dev/null | tr -d 'v \n\r' || echo '0.6.0.1')" -o iceradar-webui ./webui
	@echo "✓ Web UI built successfully"

# Web UI 実行（go run で直接実行）
run-webui:
	@echo "Running Web UI..."
	go run ./webui

# Mac開発用: ビルドしてフォアグラウンド実行
run: build-webui
	./iceradar-webui

# 配布用パッケージ一括ビルド
dist: dist-dev
dist-deb: dist-deb-dev

dist-dev: dist-deb-dev dist-zip-dev
dist-prod: dist-deb-prod dist-zip-prod

dist-deb-dev: download
	@echo "Packaging .deb for Linux (DEV)..."
	chmod +x scripts/build_deb.sh
	BUILD_ENV=dev UPDATE_BASE_URL="$(DEV_UPDATE_BASE_URL)" ./scripts/build_deb.sh

dist-deb-prod: download
	@echo "Packaging .deb for Linux (PROD)..."
	chmod +x scripts/build_deb.sh
	BUILD_ENV=prod UPDATE_BASE_URL="$(PROD_UPDATE_BASE_URL)" ./scripts/build_deb.sh

dist-zip-dev: download
	@echo "Packaging .zip for Windows/macOS/Linux (DEV)..."
	chmod +x scripts/build_zip.sh
	BUILD_ENV=dev UPDATE_BASE_URL="$(DEV_UPDATE_BASE_URL)" ./scripts/build_zip.sh

dist-zip-prod: download
	@echo "Packaging .zip for Windows/macOS/Linux (PROD)..."
	chmod +x scripts/build_zip.sh
	BUILD_ENV=prod UPDATE_BASE_URL="$(PROD_UPDATE_BASE_URL)" ./scripts/build_zip.sh

# -------------------------------------------------------
# Documentation & VPS Deployment
# -------------------------------------------------------

update-docs-version:
	chmod +x scripts/update_docs_version.sh
	bash scripts/update_docs_version.sh

update-docs-version-dev: check-deploy-dev-env
	chmod +x scripts/update_docs_version.sh
	UPDATE_BASE_URL="$(DEV_UPDATE_BASE_URL)" bash scripts/update_docs_version.sh

update-docs-version-prod: check-deploy-prod-env
	chmod +x scripts/update_docs_version.sh
	UPDATE_BASE_URL="$(PROD_UPDATE_BASE_URL)" bash scripts/update_docs_version.sh

docs-serve: update-docs-version
	docker run --rm -it -p 8000:8000 -v $(shell pwd):/docs squidfunk/mkdocs-material

docs-build: update-docs-version
	docker run --rm -v $(shell pwd):/docs squidfunk/mkdocs-material build

docs-build-dev: update-docs-version-dev
	docker run --rm -v $(shell pwd):/docs squidfunk/mkdocs-material build

docs-build-prod: update-docs-version-prod
	docker run --rm -v $(shell pwd):/docs squidfunk/mkdocs-material build

check-deploy-dev-env:
	@if [ -z "$(DEV_DEPLOY_IP)" ] || [ -z "$(DEV_DEPLOY_USER)" ] || [ -z "$(DEV_DEPLOY_DIR)" ]; then \
		echo "Error: DEV_DEPLOY_IP, DEV_DEPLOY_USER, or DEV_DEPLOY_DIR is not set in deploy.dev.env."; \
		exit 1; \
	fi

check-deploy-prod-env:
	@if [ -z "$(PROD_DEPLOY_IP)" ] || [ -z "$(PROD_DEPLOY_USER)" ] || [ -z "$(PROD_DEPLOY_DIR)" ]; then \
		echo "Error: PROD_DEPLOY_IP, PROD_DEPLOY_USER, or PROD_DEPLOY_DIR is not set in deploy.prod.env."; \
		exit 1; \
	fi

ensure-remote-dir-dev: check-deploy-dev-env
	@ssh -p $${DEV_DEPLOY_PORT:-22} $$( [ -n "$(DEV_SSH_KEY)" ] && echo "-i $(DEV_SSH_KEY)" ) $(DEV_DEPLOY_USER)@$(DEV_DEPLOY_IP) '[ -w "$(DEV_DEPLOY_DIR)" ]' 2>/dev/null || ( \
		echo "Remote directory $(DEV_DEPLOY_DIR) is not writable or does not exist on target server."; \
		echo "Prompting for remote sudo password to execute mkdir and chown..."; \
		ssh -t -p $${DEV_DEPLOY_PORT:-22} $$( [ -n "$(DEV_SSH_KEY)" ] && echo "-i $(DEV_SSH_KEY)" ) $(DEV_DEPLOY_USER)@$(DEV_DEPLOY_IP) 'sudo mkdir -p "$(DEV_DEPLOY_DIR)" && sudo chown -R $(DEV_DEPLOY_USER) "$(DEV_DEPLOY_DIR)"' \
	)

ensure-remote-dir-prod: check-deploy-prod-env
	@ssh -p $${PROD_DEPLOY_PORT:-22} $$( [ -n "$(PROD_SSH_KEY)" ] && echo "-i $(PROD_SSH_KEY)" ) $(PROD_DEPLOY_USER)@$(PROD_DEPLOY_IP) '[ -w "$(PROD_DEPLOY_DIR)" ]' 2>/dev/null || ( \
		echo "Remote directory $(PROD_DEPLOY_DIR) is not writable or does not exist on target server."; \
		echo "Prompting for remote sudo password to execute mkdir and chown..."; \
		ssh -t -p $${PROD_DEPLOY_PORT:-22} $$( [ -n "$(PROD_SSH_KEY)" ] && echo "-i $(PROD_SSH_KEY)" ) $(PROD_DEPLOY_USER)@$(PROD_DEPLOY_IP) 'sudo mkdir -p "$(PROD_DEPLOY_DIR)" && sudo chown -R $(PROD_DEPLOY_USER) "$(PROD_DEPLOY_DIR)"' \
	)

docs-deploy-dev: check-deploy-dev-env docs-build-dev ensure-remote-dir-dev
	@echo "Deploying docs to $(DEV_DEPLOY_USER)@$(DEV_DEPLOY_IP):$(DEV_DEPLOY_DIR)..."
	rsync -avz --delete --exclude 'downloads' --exclude 'bitstreams' \
		-e "ssh -p $${DEV_DEPLOY_PORT:-22} $$( [ -n "$(DEV_SSH_KEY)" ] && echo "-i $(DEV_SSH_KEY)" )" \
		site/ $(DEV_DEPLOY_USER)@$(DEV_DEPLOY_IP):$(DEV_DEPLOY_DIR)/
	@echo "Successfully deployed documentation to $(DEV_DEPLOY_IP):$(DEV_DEPLOY_DIR)"

docs-deploy-prod: check-deploy-prod-env docs-build-prod ensure-remote-dir-prod
	@echo "Deploying docs to $(PROD_DEPLOY_USER)@$(PROD_DEPLOY_IP):$(PROD_DEPLOY_DIR)..."
	rsync -avz --delete --exclude 'downloads' --exclude 'bitstreams' \
		-e "ssh -p $${PROD_DEPLOY_PORT:-22} $$( [ -n "$(PROD_SSH_KEY)" ] && echo "-i $(PROD_SSH_KEY)" )" \
		site/ $(PROD_DEPLOY_USER)@$(PROD_DEPLOY_IP):$(PROD_DEPLOY_DIR)/
	@echo "Successfully deployed documentation to $(PROD_DEPLOY_IP):$(PROD_DEPLOY_DIR)"

deploy-docs-dev: docs-deploy-dev
deploy-docs-prod: docs-deploy-prod
deploy-docs: deploy-docs-prod

update-docs-dev: docs-deploy-dev
update-docs-prod: docs-deploy-prod
update-docs: deploy-docs-prod

prepare-dist-downloads:
	@echo "Preparing distribution packages and bitstreams in site..."
	rm -rf site/downloads site/bitstreams
	mkdir -p site/downloads site/bitstreams
	cp -f dist_out/*.deb site/downloads/ 2>/dev/null || true
	cp -f dist_out/*.zip site/downloads/ 2>/dev/null || true
	cp -f redpitaya/bitstreams/* site/bitstreams/ 2>/dev/null || true
	@echo '{"version":"'$$(cat VERSION | tr -d 'v\n')'","released_at":"'$$(date -u +%Y-%m-%dT%H:%M:%SZ)'","packages":{"amd64":"iceradar-webui-'$$(cat VERSION | tr -d 'v\n')'-amd64.deb","arm64":"iceradar-webui-'$$(cat VERSION | tr -d 'v\n')'-arm64.deb"}}' > site/downloads/latest.json

deploy-dev: check-deploy-dev-env dist-dev docs-build-dev prepare-dist-downloads ensure-remote-dir-dev
	@echo "Deploying docs, packages, and bitstreams to $(DEV_DEPLOY_USER)@$(DEV_DEPLOY_IP):$(DEV_DEPLOY_DIR)..."
	rsync -avz --delete \
		-e "ssh -p $${DEV_DEPLOY_PORT:-22} $$( [ -n "$(DEV_SSH_KEY)" ] && echo "-i $(DEV_SSH_KEY)" )" \
		site/ $(DEV_DEPLOY_USER)@$(DEV_DEPLOY_IP):$(DEV_DEPLOY_DIR)/
	@echo "Successfully deployed documentation, packages, and bitstreams to $(DEV_DEPLOY_IP):$(DEV_DEPLOY_DIR)"

deploy-prod: check-deploy-prod-env dist-prod docs-build-prod prepare-dist-downloads ensure-remote-dir-prod
	@echo "Deploying docs, packages, and bitstreams to $(PROD_DEPLOY_USER)@$(PROD_DEPLOY_IP):$(PROD_DEPLOY_DIR)..."
	rsync -avz --delete \
		-e "ssh -p $${PROD_DEPLOY_PORT:-22} $$( [ -n "$(PROD_SSH_KEY)" ] && echo "-i $(PROD_SSH_KEY)" )" \
		site/ $(PROD_DEPLOY_USER)@$(PROD_DEPLOY_IP):$(PROD_DEPLOY_DIR)/
	@echo "Successfully deployed documentation, packages, and bitstreams to $(PROD_DEPLOY_IP):$(PROD_DEPLOY_DIR)"

dist-deploy-dev: deploy-dev
dist-deploy-prod: deploy-prod



upload-bitstream-dev: check-deploy-dev-env
	@echo "Uploading bitstreams to DEV Server..."
	chmod +x scripts/upload_temp_bitstream.sh
	./scripts/upload_temp_bitstream.sh --upload-dev

upload-bitstream-prod: check-deploy-prod-env
	@echo "Uploading bitstreams to PROD Server..."
	chmod +x scripts/upload_temp_bitstream.sh
	./scripts/upload_temp_bitstream.sh --upload-vps

