# Makefile for Quarto Project Automation
# Detect OS
OS := $(shell uname | tr A-Z a-z)
ifeq ($(OS), darwin)
    OS := OSX
else ifeq ($(OS), linux)
    OS := linux
else
    $(error Unknown operating system)
endif

# Fetch Git branch and project details
branchname := $(shell git branch --show-current)
reponame := $(shell basename $(shell git rev-parse --show-toplevel))
projtype := $(shell basename $(shell dirname $(shell git rev-parse --show-toplevel)))
pubtype := $(if $(findstring PUB,$(branchname)),public,protected)
remotedir := drwater@serev:/home/www/drwater/$(projtype)/$(pubtype)/$(reponame)/@$(branchname)
outputdir := $(shell awk -F': *' '/^ *output-dir:/ {print $$2 "/" }' ./_quarto.yml)
siteurl := https://drwater.rcees.ac.cn/$(projtype)/$(pubtype)/$(reponame)/@$(branchname)

# Variables for colors and port
bcolor := grey
port := 4199

# Set background color based on branch name
ifeq ($(findstring R1,$(branchname)),R1)
    bcolor := orange
else ifeq ($(findstring R2,$(branchname)),R2)
    bcolor := lightblue
else ifeq ($(findstring R3,$(branchname)),R3)
    bcolor := lightgreen
else ifeq ($(findstring PUB,$(branchname)),PUB)
    bcolor := light
endif

# Set port based on branch name
branch_ports := main:4200 SM:4201 TX:4202 FJ:4203 YF:4204 ZY:4205 WW:4206 JB:4207 YY:4208 YJ:4209 DYF:4210
port := $(shell echo $(branch_ports) | tr " " "\n" | grep -E "^$(branchname):" | sed -E 's/^$(branchname):([0-9]+)/\1/')
port := $(if $(port),$(port),4199)

# Define the state file
STATE_FILE := .source_state

# checkfile
GREPSTR := " \|(\|)\|^submit\|^analysis\|_cache\|_freeze\|^site_libs\|^www"

# Default target
.PHONY: all preview readme rsync local clean upload fix_links force check_git_status

all: local upload clean commit
	
force: check_git_status render filehash upload clean commit

local: check_git_status lazyrender

# Update Makefile from a specific location if on macOS
updmakefile:
	@if [ "$(OS)" = "OSX" ]; then \
		echo "基于 $$HOME/bin/publish2dw.Makefile 更新本项目 Makefile..."; \
		cp "$$HOME/bin/publish2dw.Makefile" "./Makefile"; \
		git add "Makefile" && git commit -m "Update Makefile"; \
		echo "本项目Makefile更新完成."; \
	else \
		echo "Makefile 无需在本系统上更新."; \
	fi


check_git_status:
	@uncommitted=$$(git status --porcelain); \
	if [ -n "$$uncommitted" ]; then \
	  git status; \
		read -p "当前存在未提交的修改（如上），是否要提交？(Y/N, default is N): " answer; \
		answer=$${answer:-N}; \
		if [ "$$answer" = "Y" ] || [ "$$answer" = "y" ]; then \
			read -p "请输入修改说明: " message; \
			git add . && git commit -m "$$message"; \
		else \
			echo "未提交，如后续操作为pull，则无法继续"; \
		fi; \
	fi



# Lazy render with hash checking
lazyrender:
	@current_hash=$$(find $(shell git ls-files "*.qmd" "_*.yml" "*.pdf" "*.svg" "*.png" | grep -v $(GREPSTR)) -exec cat {} + | md5sum | awk '{print $$1}'); \
	if [ ! -f $(STATE_FILE) ] || [ "$$current_hash" != "$$(cat $(STATE_FILE))" ]; then \
		echo "源文件发生变化, 重新编译..."; \
		echo "$$current_hash" > $(STATE_FILE); \
		$(MAKE) render; \
	else \
		echo "源文件无变化, 跳过编译..."; \
		exit 0; \
	fi

# Render target
render:
	@quarto render

commit:
	@echo "提交修改(commit)..."; \
		git add .; \
		if [ -n "$$(git diff --cached)" ]; then \
		git commit -m "render compile"; \
		else \
		echo "没有修改记录，跳过."; \
		fi; \

# Pull changes from the specified branch based on the current branch
pull:
	@echo "从远程拉取项目更新..."; \
		$(MAKE) check_git_status; \
		current_branch=$$(git rev-parse --abbrev-ref HEAD); \
		if [ "$$current_branch" = main ]; then \
		  echo "当前分枝为$$current_branch."; \
			remote_branch=$$(git branch --remote | grep -v 'main' | grep "[A-Z]\{2,\}" | awk '{print $$1}' | sed 's/origin\///' | head -n 1); \
			if [ -n "$$remote_branch" ]; then \
		    echo "尝试从远程分枝$$remote_branch 拉取更新..."; \
				git pull origin $$remote_branch; \
			else \
				echo "远程无可用分支$$remote_branch."; \
			fi; \
			else \
			echo "尝试将远程main分枝合并至本地$$current_branch 分枝."; \
			git pull origin main; \
		fi

# Pull changes from the main branch
pullmain:
	$(MAKE) check_git_status; \
		@current_branch=$$(git rev-parse --abbrev-ref HEAD); \
		@echo "尝试将远程main分枝合并至本地$$current_branch 分枝."; \
		git pull origin main; \

push:
	@echo "推送到远程..."; \
		git push

filehash:
	@current_hash=$$(find $(shell git ls-files "*.qmd" "_*.yml" "*.pdf" "*.svg" "*.png" | grep -v $(GREPSTR)) -exec cat {} + | md5sum | awk '{print $$1}'); \
	echo "$$current_hash" > $(STATE_FILE)

# Preview the site on a specific port
preview:
	@quarto preview --port $(port)

# Generate README.md
readme:
	@quarto render index.qmd -t markdown -o README.md
	@sed -e '/^---/,/^---/d' "$(outputdir)/README.md" > README.md
	@rm "$(outputdir)/README.md"

# Sync files with remote server
rsync:
	@rsync -azvu --progress --delete -r "$(outputdir)" "$(remotedir)"

# Open local site
open:
	@if [ "$(OS)" = "OSX" ]; then open "$(outputdir)/index.html"; fi

# Clean unnecessary files
clean:
	@rm -f ./*.spl ./*.aux ./*.bbl ./*.blg ./*.log ./*.tex ./*.bcf ./*.tex.sedbak ./*.fdb_latexmk

# Upload files to server and fix links
upload:
	@mkdir -p "$(outputdir)" && chmod -R 2775 "$(outputdir)"
	@$(MAKE) fix_links
	@if rsync -azvu --progress --delete -r "$(outputdir)" "$(remotedir)"; then \
		if [ "$(OS)" = "OSX" ]; then \
			open "$(siteurl)" 2>/dev/null; \
		fi; \
	else \
		echo "Rsync failed. Attempting alternative upload method..."; \
		mkdir -p "$(reponame)"; \
		rsync -azvu --progress --delete -r "$(reponame)" "$(dir $(remotedir))"; \
		rm -rf "$(reponame)"; \
		rsync -azvu --progress --delete -r "$(outputdir)" "$(remotedir)"; \
		if [ "$(OS)" = "OSX" ]; then \
			open "$(siteurl)" 2>/dev/null; \
		fi; \
	fi

# Fix links in www directory
fix_links:
	@find ./www -type f -name "*.html" -exec sed -i.bak \
		-e "s/{{< var branch >}}/$(branchname)/g" \
		-e "s/{{< var pubtype >}}/$(pubtype)/g" \
		-e "s/{{< var projtype >}}/$(projtype)/g" \
		-e "s/{{< var reponame >}}/$(reponame)/g" \
		-e "s/$(reponame)\/blob/$(reponame)\/raw\/branch/g" \
		-e "s/$(reponame)\/edit/$(reponame)\/_edit/g" {} +
	@find ./www -type f -name "*.bak" -exec rm {} +


# Help: list all available commands with descriptions (English and Chinese)
help:
	@echo "Makefile for Quarto Project Automation"
	@echo "======================================="
	@echo "Available targets (English):"
	@echo ""
	@echo "  make all           - Execute local build, upload, clean, and commit"
	@echo "  make force         - Force render, hash update, upload, clean, and commit"
	@echo "  make local         - Check git status and perform a lazy render if changes detected"
	@echo "  make check_git_status - Check for uncommitted changes and ask to commit them"
	@echo "  make lazyrender    - Render if source files have changed based on hash comparison"
	@echo "  make render        - Force Quarto to render the project"
	@echo "  make commit        - Commit changes if no previous uncommitted changes"
	@echo "  make filehash      - Generate and store the file hash of source files"
	@echo "  make preview       - Preview the site locally on the specific port (default: 4199)"
	@echo "  make readme        - Render README.md from Quarto index.qmd"
	@echo "  make rsync         - Sync output files with the remote server"
	@echo "  make open          - Open the generated site locally in the browser"
	@echo "  make clean         - Clean up unnecessary files"
	@echo "  make upload        - Upload files to the server and fix links"
	@echo "  make fix_links     - Fix HTML links in the 'www' directory for the remote server"
	@echo "  make updmakefile   - Update the Makefile"
	@echo "  make help          - Display this help message"
	@echo ""
	@echo "Available targets (中文):"
	@echo ""
	@echo "  make all           - 执行本地构建、上传、清理和提交"
	@echo "  make force         - 强制渲染、更新哈希、上传、清理并提交"
	@echo "  make local         - 检查Git状态，若检测到更改则进行懒惰渲染"
	@echo "  make check_git_status - 检查未提交的更改，并询问是否提交"
	@echo "  make lazyrender    - 如果源文件发生更改，则根据哈希比较进行渲染"
	@echo "  make render        - 强制 Quarto 渲染项目"
	@echo "  make commit        - 如果没有未提交的更改则提交"
	@echo "  make filehash      - 生成并存储源文件的哈希值"
	@echo "  make preview       - 本地在特定端口预览网站 (默认: 4199)"
	@echo "  make readme        - 从 Quarto 的 index.qmd 生成 README.md"
	@echo "  make rsync         - 将输出文件同步到远程服务器"
	@echo "  make open          - 在浏览器中打开生成的网站"
	@echo "  make clean         - 清理不必要的文件"
	@echo "  make upload        - 上传文件到服务器并修复链接"
	@echo "  make fix_links     - 修复 'www' 目录中的 HTML 链接"
	@echo "  make updmakefile   - 更新本项目 Makefile"
	@echo "  make help          - 显示此帮助信息"
	@echo ""
	@echo "Environment variables (English and 中文):"
	@echo "  bcolor             - Background color based on branch name (基于分支名的背景颜色)"
	@echo "  port               - Port number based on branch name (基于分支名的端口号)"
	@echo "  STATE_FILE         - File for storing hash state of source files (用于存储源文件哈希状态的文件)"
	@echo "  siteurl            - The URL where the site will be hosted (网站托管的 URL)"
	@echo ""


