# Makefile for Joomla Extensions
# Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# MokoJoomGallery — Photo gallery management for Joomla

# ==============================================================================
# CONFIGURATION - Customize these for your extension
# ==============================================================================

# Extension Configuration
EXTENSION_NAME := mokojoomgallery
EXTENSION_TYPE := package
# Options: module, plugin, component, package, template
EXTENSION_VERSION := 1.0.0

# Module Configuration (for modules only)
MODULE_TYPE := site
# Options: site, admin

# Plugin Configuration (for plugins only)
PLUGIN_GROUP := system
# Options: system, content, user, authentication, etc.

# Directories
SRC_DIR := src
BUILD_DIR := build
DIST_DIR := dist
DOCS_DIR := docs

# Joomla Installation (for local testing - customize paths)
JOOMLA_ROOT := /var/www/html/joomla
JOOMLA_VERSION := 4

# Tools
PHP := php
COMPOSER := composer
NPM := npm
PHPCS := vendor/bin/phpcs
PHPCBF := vendor/bin/phpcbf
PHPUNIT := vendor/bin/phpunit
ZIP := zip

# Coding Standards
PHPCS_STANDARD := Joomla

# Colors for output
COLOR_RESET := \033[0m
COLOR_GREEN := \033[32m
COLOR_YELLOW := \033[33m
COLOR_BLUE := \033[34m
COLOR_RED := \033[31m

# ==============================================================================
# TARGETS
# ==============================================================================

.PHONY: help
help: ## Show this help message
	@echo "$(COLOR_BLUE)╔════════════════════════════════════════════════════════════╗$(COLOR_RESET)"
	@echo "$(COLOR_BLUE)║            Joomla Extension Makefile                       ║$(COLOR_RESET)"
	@echo "$(COLOR_BLUE)╚════════════════════════════════════════════════════════════╝$(COLOR_RESET)"
	@echo ""
	@echo "Extension: $(EXTENSION_NAME) ($(EXTENSION_TYPE)) v$(EXTENSION_VERSION)"
	@echo ""
	@echo "$(COLOR_GREEN)Available targets:$(COLOR_RESET)"
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "  $(COLOR_BLUE)%-20s$(COLOR_RESET) %s\n", $$1, $$2}'
	@echo ""

.PHONY: install-deps
install-deps: ## Install all dependencies (Composer + npm)
	@echo "$(COLOR_BLUE)Installing dependencies...$(COLOR_RESET)"
	@if [ -f "composer.json" ]; then \
		$(COMPOSER) install; \
		echo "$(COLOR_GREEN)✓ Composer dependencies installed$(COLOR_RESET)"; \
	fi

.PHONY: lint
lint: ## Run PHP linter (syntax check)
	@echo "$(COLOR_BLUE)Running PHP linter...$(COLOR_RESET)"
	@find . -name "*.php" ! -path "./vendor/*" ! -path "./node_modules/*" ! -path "./$(BUILD_DIR)/*" \
		-exec $(PHP) -l {} \; | grep -v "No syntax errors" || true
	@echo "$(COLOR_GREEN)✓ PHP linting complete$(COLOR_RESET)"

.PHONY: phpcs
phpcs: ## Run PHP CodeSniffer (Joomla standards)
	@echo "$(COLOR_BLUE)Running PHP CodeSniffer...$(COLOR_RESET)"
	@if [ -f "$(PHPCS)" ]; then \
		$(PHPCS) --standard=$(PHPCS_STANDARD) --extensions=php --ignore=vendor,node_modules,$(BUILD_DIR) .; \
	else \
		echo "$(COLOR_YELLOW)⚠ PHP CodeSniffer not installed. Run: make install-deps$(COLOR_RESET)"; \
	fi

.PHONY: validate
validate: lint phpcs ## Run all validation checks
	@echo "$(COLOR_GREEN)✓ All validation checks passed$(COLOR_RESET)"

.PHONY: clean
clean: ## Clean build artifacts
	@echo "$(COLOR_BLUE)Cleaning build artifacts...$(COLOR_RESET)"
	@rm -rf $(BUILD_DIR) $(DIST_DIR)
	@echo "$(COLOR_GREEN)✓ Build artifacts cleaned$(COLOR_RESET)"

MOKO_PLATFORM ?= $(or $(wildcard ../moko-platform),$(wildcard $(HOME)/moko-platform),$(wildcard /opt/moko-platform))
MINIFY_SCRIPT := $(MOKO_PLATFORM)/build/minify.js

.PHONY: minify
minify: ## Minify CSS/JS assets
	@echo "Minifying assets..."
	@if [ -f "$(MINIFY_SCRIPT)" ]; then \
		node "$(MINIFY_SCRIPT)" $(SRC_DIR); \
	elif [ -f "scripts/minify.js" ]; then \
		node scripts/minify.js; \
	else \
		echo "No minify script found"; \
	fi

.PHONY: build
build: clean minify ## Build extension package
	@echo "$(COLOR_BLUE)Building Joomla package extension...$(COLOR_RESET)"
	@mkdir -p $(DIST_DIR) $(BUILD_DIR)/packages

	@# --- Build each sub-extension as a separate ZIP ---
	@for EXT_DIR in $(SRC_DIR)/packages/*/; do \
		EXT_NAME=$$(basename "$$EXT_DIR"); \
		[ "$$EXT_NAME" = "index.html" ] && continue; \
		echo "  Packaging $$EXT_NAME..."; \
		cd "$$EXT_DIR" && $(ZIP) -r "$(CURDIR)/$(BUILD_DIR)/packages/$${EXT_NAME}.zip" . \
			-x "*.git*" -x "*/index.html" 2>/dev/null; \
		cd "$(CURDIR)"; \
	done

	@# --- Build the outer package ZIP ---
	@echo "  Assembling pkg_$(EXTENSION_NAME)..."
	@cp $(SRC_DIR)/pkg_mokojoomgallery.xml $(BUILD_DIR)/pkg_mokojoomgallery.xml
	@cp $(SRC_DIR)/script.php $(BUILD_DIR)/script.php
	@[ -d "$(SRC_DIR)/language" ] && cp -r $(SRC_DIR)/language $(BUILD_DIR)/language || true
	@cd $(BUILD_DIR) && $(ZIP) -r "$(CURDIR)/$(DIST_DIR)/pkg_$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip" \
		pkg_mokojoomgallery.xml script.php language/ packages/

	@echo "$(COLOR_GREEN)✓ Package created: $(DIST_DIR)/pkg_$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip$(COLOR_RESET)"
	@echo "  Contents:"
	@unzip -l "$(DIST_DIR)/pkg_$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip" | tail -n +4 | head -20

.PHONY: package
package: build ## Alias for build
	@echo "$(COLOR_GREEN)✓ Package ready for distribution$(COLOR_RESET)"

.PHONY: release
release: validate build ## Create a release (validate + build)
	@echo "$(COLOR_GREEN)✓ Release package ready$(COLOR_RESET)"

.PHONY: version
version: ## Display version information
	@echo "$(COLOR_BLUE)Extension Information:$(COLOR_RESET)"
	@echo "  Name:    $(EXTENSION_NAME)"
	@echo "  Type:    $(EXTENSION_TYPE)"
	@echo "  Version: $(EXTENSION_VERSION)"

.PHONY: security-check
security-check: ## Run security checks on dependencies
	@echo "$(COLOR_BLUE)Running security checks...$(COLOR_RESET)"
	@if [ -f "composer.json" ]; then \
		$(COMPOSER) audit || echo "$(COLOR_YELLOW)⚠ Vulnerabilities found$(COLOR_RESET)"; \
	fi

.PHONY: all
all: install-deps validate build ## Run complete build pipeline
	@echo "$(COLOR_GREEN)✓ Complete build pipeline finished$(COLOR_RESET)"

# Default target
.DEFAULT_GOAL := help
