SHELL := /bin/bash
.DEFAULT_GOAL := help

PROJECT   := compro-mit
REPO      := repository.promas.id/ComproMIT/compro-mit
ENV_FILE  := .env

ifneq (,$(wildcard $(ENV_FILE)))
  include $(ENV_FILE)
  export $(shell sed -n 's/^\([A-Za-z_][A-Za-z0-9_]*\)=.*/\1/p' $(ENV_FILE))
endif

# ---- per-environment (env = prod | dev | local) ----
WORK_DIR_prod  := /var/www/compro-mit-prod
WORK_DIR_dev   := /var/www/compro-mit
WORK_DIR_local := $(CURDIR)
COMPOSE_prod   := docker-compose.yml
COMPOSE_dev    := docker-compose.dev.yml
COMPOSE_local  := docker-compose.local.yml
BRANCH_prod    := production
BRANCH_dev     := main

WORK_DIR = $(WORK_DIR_$*)
COMPOSE  = $(COMPOSE_$*)
BRANCH   = $(BRANCH_$*)
DC       = sudo docker compose -f $(COMPOSE)

# ---- deploy log ----
LOG_DIR   := $(or $(DEPLOY_LOG_DIR),/var/lib/deploy-log)
LOG_IMAGE := deploy-log:1
OUT_FILE   = $(LOG_DIR)/$(PROJECT)/.last-deploy.out
HIST_FILE  = $(LOG_DIR)/$(PROJECT)/$*.jsonl
LOG        = sudo docker run --rm \
	-v $(LOG_DIR):/logs -v $(WORK_DIR):/repo:ro \
	-e DEPLOY_ACTOR="$$(id -un 2>/dev/null)" $(LOG_IMAGE)

.PHONY: help install run-local log-dir status ps

help: ## Tampilkan daftar perintah
	@echo "make <target>   (env = prod | dev | local)"
	@grep -hE '^[a-zA-Z%-]+:.*##' $(MAKEFILE_LIST) \
		| sed -e 's/%/<env>/' -e 's/:.*## /|/' \
		| awk -F'|' '{printf "  %-16s %s\n", $$1, $$2}'

# ---- deploy ----
deploy-%: log-dir ## Pull + build + up (prod/dev)
	@$(LOG) start $(PROJECT) $* || true
	@cd $(WORK_DIR) || exit 1; \
	( \
		sudo git pull https://$(GITLAB_USERNAME):$(GITLAB_PASSWORD)@$(REPO) $(BRANCH) && \
		$(DC) build --no-cache --progress=plain && \
		$(DC) up -d --remove-orphans && \
		sudo docker system prune -f \
	) 2>&1 | tee $(OUT_FILE); \
	RC=$${PIPESTATUS[0]}; \
	if [ "$$RC" = "0" ]; then $(LOG) end $(PROJECT) $* ok || true; \
	else $(LOG) end $(PROJECT) $* fail || true; fi; \
	exit $$RC

# ---- operasional ----
up-%: ## Build + start container
	@cd $(WORK_DIR) && $(DC) up -d --build --remove-orphans

stop-%: ## Stop container
	@cd $(WORK_DIR) && $(DC) stop

restart-%: ## Restart container
	@cd $(WORK_DIR) && $(DC) restart

logs-%: ## Tail log container
	@cd $(WORK_DIR) && $(DC) logs -f --tail=200

clean-%: ## Down + hapus image + prune
	@cd $(WORK_DIR) && $(DC) down -v --rmi local && sudo docker system prune -f

history-%: ## 10 deploy terakhir
	@test -s $(HIST_FILE) && tail -n 10 $(HIST_FILE) | tac || echo "belum ada entri"

# ---- lokal & utilitas ----
install: ## Install dependency
	@bun install

run-local: ## Jalankan dev server (tanpa docker)
	@bun run dev

status: ## Status container project ini
	@sudo docker ps -a --filter "name=$(PROJECT)" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

ps: ## Status semua container
	@sudo docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"

log-dir:
	@sudo mkdir -p $(LOG_DIR)/$(PROJECT) && sudo touch $(OUT_FILE) \
		&& sudo chown -R $$(id -u):$$(id -g) $(LOG_DIR)/$(PROJECT)
