DESTDIR ?= /
PREFIX ?= /usr
ENABLE_BASH_COMPLETION ?= true
ENABLE_ZSH_COMPLETION ?= true


BUILD_DIR := $(abspath build)
REPO_DIR := $(abspath ./)
INSTALL_ROOT := $(abspath build/install_root)
INSTALL_PREFIX :=$(abspath $(shell echo ${INSTALL_ROOT}/${PREFIX}))
DESTDIR_PREFIX :=$(abspath $(shell echo ${DESTDIR}/${PREFIX}))

DISTRO := $(shell [ -e "/etc/os-release" ] && cat /etc/os-release|sed -n -e 's/^ID="\?\(\w*\)"\?/\1/p' )

ifeq (${ENABLE_BASH_COMPLETION}, true)
    ifeq ($(shell pkg-config --exists bash-completion && echo 0), 0)
        bashcompletiondir := $(shell pkg-config --variable=completionsdir bash-completion)
    endif
endif

ifeq (${ENABLE_ZSH_COMPLETION}, true)
    ifeq ($(shell which zsh >/dev/null 2>&1 && echo 0), 0)
        zshcompletiondir := /usr/share/zsh/site-functions/
    endif
endif

ifdef bashcompletiondir
    bashcompletiondir_local := ${INSTALL_ROOT}/${bashcompletiondir}
    $(info Bash completion to install at: ${bashcompletiondir})
else
    $(info No Bash completion)
endif
ifdef zshcompletiondir
    zshcompletiondir_local := ${INSTALL_ROOT}/${zshcompletiondir}
    $(info ZSH completion to install at: ${zshcompletiondir})
else
    $(info No ZSH completion)
endif

all: build

# Dist and web-greeter directories
build/dist := ${BUILD_DIR}/dist
build/web-greeter := ${BUILD_DIR}/web-greeter

$(build/dist): dist/*
	@rm -rf "${BUILD_DIR}/dist"
	@rsync -a "${REPO_DIR}/dist" "${BUILD_DIR}"
	@cp "${REPO_DIR}/NEWS.md" "${BUILD_DIR}/dist/NEWS.md"
	@echo "✔ Dist directory created at ${build/dist}"

$(build/web-greeter): src/*
	@rsync -a "${REPO_DIR}/src/" "${BUILD_DIR}/web-greeter" --exclude "dist" --exclude "__pycache__"
	@cp "${REPO_DIR}/README.md" "${BUILD_DIR}/web-greeter/"
	@echo "✔ Build directory created at ${build/web-greeter}"

# Resources
bundle.js := ${BUILD_DIR}/web-greeter/resources/js/bundle.js
bundle/ThemeUtils := ${REPO_DIR}/src/resources/js/ThemeUtils.js
bundle/GreeterComm := ${REPO_DIR}/src/resources/js/GreeterComm.js
bundle/bootstrap := ${REPO_DIR}/src/resources/js/bootstrap.js

$(bundle.js): $(build/web-greeter) $(bundle/ThemeUtils) $(bundle/bootstrap) $(bundle/GreeterComm)
	@cd build/web-greeter/resources/js; \
	cat ${bundle/ThemeUtils} ${bundle/bootstrap} ${bundle/GreeterComm} > bundle.js

resources.py := ${BUILD_DIR}/web-greeter/resources.py

$(resources.py): $(bundle.js)
	@pyrcc5 -o ${BUILD_DIR}/web-greeter/resources.py\
		${BUILD_DIR}/web-greeter/resources/resources.qrc
	@cp ${resources.py} src/
	@echo "✔ Resources compiled with pyrcc5"

# Install root, where everything will be copied to
$(INSTALL_ROOT):
	@for d in man/man1 metainfo doc/web-greeter web-greeter \
		xgreeters applications icons/hicolor/scalable/apps; do \
		mkdir -p "${INSTALL_PREFIX}/share/$$d"; \
	done
	@for d in lightdm xdg/lightdm/lightdm.conf.d; do \
		mkdir -p "${INSTALL_ROOT}/etc/$$d"; \
	done
	@for d in lib/web-greeter bin; do \
		mkdir -p "${INSTALL_PREFIX}/$$d"; \
	done
	@echo "✔ Install root created at ${INSTALL_ROOT}"

# ZSH completion install
$(zshcompletiondir_local): $(INSTALL_ROOT)
	@if [ -n "${zshcompletiondir}" ]; then \
		mkdir -p "${zshcompletiondir_local}"; \
		cp "${BUILD_DIR}/dist/web-greeter-zsh" "${zshcompletiondir_local}/_web-greeter"; \
		echo " ZSH completion copied"; \
	fi

# Bash completion install
$(bashcompletiondir_local): $(INSTALL_ROOT)
	@if [ -n "${bashcompletiondir}" ]; then \
		mkdir -p "${bashcompletiondir_local}"; \
		cp "${BUILD_DIR}/dist/web-greeter-bash" "${bashcompletiondir_local}/web-greeter"; \
		echo " Bash completion copied"; \
	fi

build_completions: $(zshcompletiondir_local) $(bashcompletiondir_local)

# Theme installation
THEMES_DIR := $(abspath ${DESTDIR_PREFIX}/share/web-greeter/themes)
THEMES_DIR_LOCAL := $(abspath ${INSTALL_PREFIX}/share/web-greeter/themes)
themes/gruvbox := $(abspath ${THEMES_DIR_LOCAL}/gruvbox)
themes/gruvbox/js := $(abspath ${REPO_DIR}/themes/themes/gruvbox/js)
themes/dracula := $(abspath ${THEMES_DIR_LOCAL}/dracula)
themes/dracula/js := $(abspath ${REPO_DIR}/themes/themes/dracula/js)
themes/simple := $(abspath ${THEMES_DIR_LOCAL}/simple)
themes/_vendor := $(abspath ${INSTALL_PREFIX}/share/web-greeter/_vendor)

$(THEMES_DIR_LOCAL): $(INSTALL_ROOT)
	@mkdir -p "${THEMES_DIR_LOCAL}"

$(themes/gruvbox/js): themes/themes/gruvbox/ts
	@tsc --build themes/themes/gruvbox
	@echo " Gruvbox theme compiled"

$(themes/dracula/js): themes/themes/dracula/ts
	@tsc --build themes/themes/dracula
	@echo " Dracula theme compiled"

$(themes/gruvbox): $(THEMES_DIR_LOCAL) $(themes/gruvbox/js) themes/themes/gruvbox
	@if [ -d "${themes/gruvbox}" ]; then \
		rm -rf "${themes/gruvbox}"; \
	fi
	@cp -r "${REPO_DIR}/themes/themes/gruvbox" "${themes/gruvbox}"
	@echo " Gruvbox theme copied"
$(themes/dracula): $(THEMES_DIR_LOCAL) $(themes/dracula/js) themes/themes/dracula
	@if [ -d "${themes/dracula}" ]; then \
		rm -rf "${themes/dracula}"; \
	fi
	@cp -r "${REPO_DIR}/themes/themes/dracula" "${themes/dracula}"
	@echo " Dracula theme copied"
$(themes/simple): $(THEMES_DIR_LOCAL) themes/themes/simple/*
	@cp -r "${REPO_DIR}/themes/themes/simple" "${themes/simple}"
	@echo " Simple theme copied"

$(themes/_vendor): $(INSTALL_ROOT) themes/themes/_vendor/*
	@cp -r "${REPO_DIR}/themes/themes/_vendor" "${themes/_vendor}"
	@echo " Theme vendors copied"

build_themes: $(themes/gruvbox) $(themes/dracula) $(themes/simple) $(themes/_vendor)

# Dist files
dist/web-greeter.1 := $(abspath ${DESTDIR_PREFIX}/share/man/man1/web-greeter.1.gz)
dist/news := $(abspath ${DESTDIR_PREFIX}/share/doc/web-greeter/NEWS.gz)
dist/metainfo := $(abspath ${DESTDIR_PREFIX}/share/metainfo/web-greeter.appdata.xml)
dist/xg-desktop := $(abspath ${DESTDIR_PREFIX}/share/xgreeters/web-greeter.desktop)
dist/app-desktop := $(abspath ${DESTDIR_PREFIX}/share/applications/web-greeter.desktop)
dist/app-icon-scalable := $(abspath ${DESTDIR_PREFIX}/share/icons/hicolor/scalable/apps/com.github.jezerm.web-greeter.svg)

dist_local/web-greeter.1 := $(abspath ${INSTALL_PREFIX}/share/man/man1/web-greeter.1.gz)
dist_local/news := $(abspath ${INSTALL_PREFIX}/share/doc/web-greeter/NEWS.gz)
dist_local/metainfo := $(abspath ${INSTALL_PREFIX}/share/metainfo/web-greeter.appdata.xml)
dist_local/xg-desktop := $(abspath ${INSTALL_PREFIX}/share/xgreeters/web-greeter.desktop)
dist_local/app-desktop := $(abspath ${INSTALL_PREFIX}/share/applications/web-greeter.desktop)
dist_local/app-icon-scalable := $(abspath ${INSTALL_PREFIX}/share/icons/hicolor/scalable/apps/com.github.jezerm.web-greeter.svg)

$(dist_local/web-greeter.1): $(build/dist) $(INSTALL_ROOT) ${BUILD_DIR}/dist/web-greeter.1
	@gzip -c9 "${BUILD_DIR}/dist/web-greeter.1" > \
		"${dist_local/web-greeter.1}"

$(dist_local/news): $(build/dist) $(INSTALL_ROOT) ${BUILD_DIR}/dist/NEWS.md
	@gzip -c9 "${BUILD_DIR}/dist/NEWS.md" > \
		"${dist_local/news}"

$(dist_local/metainfo): $(build/dist) $(INSTALL_ROOT) ${BUILD_DIR}/dist/web-greeter.appdata.xml
	@cp "${BUILD_DIR}/dist/web-greeter.appdata.xml" \
		"${dist_local/metainfo}"

$(dist_local/xg-desktop): $(build/dist) $(INSTALL_ROOT) ${BUILD_DIR}/dist/web-xgreeter.desktop
	@cp "${BUILD_DIR}/dist/web-xgreeter.desktop" \
		"${dist_local/xg-desktop}"

$(dist_local/app-desktop): $(build/dist) $(INSTALL_ROOT) ${BUILD_DIR}/dist/web-greeter.desktop
	@cp "${BUILD_DIR}/dist/web-greeter.desktop" \
		"${dist_local/app-desktop}"

$(dist_local/app-icon-scalable): $(build/dist) $(INSTALL_ROOT) ${BUILD_DIR}/dist/com.github.jezerm.web-greeter.svg
	@cp "${BUILD_DIR}/dist/com.github.jezerm.web-greeter.svg" \
		"${dist_local/app-icon-scalable}"

build_dist_files: $(dist_local/web-greeter.1) $(dist_local/news) $(dist_local/metainfo) $(dist_local/xg-desktop) $(dist_local/app-desktop) $(dist_local/app-icon-scalable)
	@echo "✔ Dist files copied"

# Config files
config/web-greeter := $(abspath ${DESTDIR}/etc/lightdm/web-greeter.yml)
config/lightdm-wrapper := $(abspath ${DESTDIR}/etc/xdg/lightdm/lightdm.conf.d/90-greeter.wrapper.conf)
config/Xgreeter := $(abspath ${DESTDIR}/etc/lightdm/Xgreeter)

config_local/web-greeter := $(abspath ${INSTALL_ROOT}/etc/lightdm/web-greeter.yml)
config_local/lightdm-wrapper := $(abspath ${INSTALL_ROOT}/etc/xdg/lightdm/lightdm.conf.d/90-greeter-wrapper.conf)
config_local/Xgreeter := $(abspath ${INSTALL_ROOT}/etc/lightdm/Xgreeter)

$(config_local/web-greeter): $(INSTALL_ROOT) ${BUILD_DIR}/dist/web-greeter.yml
	@cp "${BUILD_DIR}/dist/web-greeter.yml" "${config_local/web-greeter}"
$(config_local/lightdm-wrapper): $(INSTALL_ROOT) ${BUILD_DIR}/dist/90-greeter-wrapper.conf
	@cp "${BUILD_DIR}/dist/90-greeter-wrapper.conf" "${config_local/lightdm-wrapper}"
$(config_local/Xgreeter): $(INSTALL_ROOT) ${BUILD_DIR}/dist/Xgreeter ${BUILD_DIR}/Xgreeter.patch /etc/os-release
	@install -Dm755 "${BUILD_DIR}/dist/Xgreeter" "${config_local/Xgreeter}"
	@case "${DISTRO}" in \
		fedora) \
			patch -bN "${config_local/Xgreeter}" "${BUILD_DIR}/Xgreeter.patch"; \
			;; \
	esac

build_config: $(config_local/web-greeter) $(config_local/lightdm-wrapper) $(config_local/Xgreeter)
	@echo "✔ Config copied"

build_install_root: $(INSTALL_ROOT) build_dist_files build_config build_themes build_completions

# Binaries
bin/web-greeter := $(abspath ${DESTDIR}/bin/web-greeter)
bin_local/web-greeter := $(abspath ${INSTALL_PREFIX}/bin/web-greeter)

bin/screensaver.so := ${BUILD_DIR}/web-greeter/bindings/_screensaver.so
bin/screensaver.c := ${BUILD_DIR}/web-greeter/bindings/screensaver.c

$(bin/screensaver.so): $(build/web-greeter)
	@gcc ${bin/screensaver.c} -o ${bin/screensaver.so} -shared -lX11 -lxcb
	@cp ${bin/screensaver.so} src/bindings/
	@echo "✔ Screensaver.so compiled"

$(bin_local/web-greeter): build_install_root $(resources.py) $(bin/screensaver.so)
	@rm -rf "${INSTALL_PREFIX}/lib/web-greeter/*"
	@cp -R "${BUILD_DIR}/web-greeter"/* "${INSTALL_PREFIX}/lib/web-greeter"
	@printf "#!/usr/bin/env bash\npython3 ${DESTDIR_PREFIX}/lib/web-greeter \$$@" > \
		"${bin_local/web-greeter}"
	@chmod +x "${bin_local/web-greeter}"
	@echo "✔ web-greeter binary copied"

# Useful rules
.PHONY: build
build: $(bin_local/web-greeter)
	@echo "✔ Build succeded"

.PHONY: install
install: build
	[ -e "${DESTDIR}" ] || mkdir -p "${DESTDIR}"
	cp -R "${INSTALL_ROOT}"/* "${DESTDIR}"
	@echo "✔ Install succeded"

# Uninstall everything except themes and web-greeter.yml
uninstall_preserve:
	@rm -f "${dist/web-greeter.1}"
	@rm -f "${dist/app-desktop}"
	@rm -f "${dist/xg-desktop}"
	@rm -f "${dist/metainfo}"
	@rm -f "${dist/news}"
	@rm -f "${config/lightdm-wrapper}"
	@rm -f "${config/Xgreeter}"
	@rm -f "${bin/web-greeter}"
	@if [ -n "${bashcompletiondir}" ]; then \
		rm -f "${bashcompletiondir}/web-greeter"; \
	fi
	@if [ -n "${zshcompletiondir}" ]; then \
		rm -f "${zshcompletiondir}/_web-greeter"; \
	fi

# Uninstall everything
uninstall_all: uninstall_preserve
	@rm -rf "${config/web-greeter}"
	@rm -rf "${DESTDIR_PREFIX}/web-greeter/"

.PHONY: uninstall
uninstall: uninstall_preserve
	@echo " Themes are not uninstalled. Remove them manually or use \`make uninstall_all\`:\
		\n${DESTDIR_PREFIX}/share/web-greeter"
	@echo " web-greeter config was not uninstalled. Remove it manually or use \`make uninstall_all\`:\
		\n${config/web-greeter}"

run: $(resources.py)
	python3 src

run_debug: $(resources.py)
	python3 src --debug

clean:
	rm -rf ${INSTALL_ROOT} ${BUILD_DIR}/dist ${BUILD_DIR}/web-greeter
