
.PHONY: help
.DEFAULT_GOAL := help

# Docker Compose file
DOCKER_COMPOSE_FILE := docker-compose.dev.yml

# Define a variable
VERSION := $(shell cat VERSION 2>/dev/null || echo "unknown")

help: ## Show this help message
	@egrep -h '\s##\s' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

# =============================================================================
# Docker Commands
# =============================================================================

up: ## Start all docker services
	docker compose -f $(DOCKER_COMPOSE_FILE) up -d -V
dev:
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api /bin/bash -c ". /var/www/.nvm/nvm.sh && npm run dev -- --host"
npm-install:
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api /bin/bash -c ". /var/www/.nvm/nvm.sh && npm install"
composer-install:
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api composer install
# run composer install and npm install
install:
	@make composer-install
	@make npm-install

build: ## Build and start all docker services (use when modifying docker files)
	docker compose -f $(DOCKER_COMPOSE_FILE) up --build -d

down: ## Stop and remove all docker containers
	docker compose -f $(DOCKER_COMPOSE_FILE) down

restart: ## Restart all docker services
	docker compose -f $(DOCKER_COMPOSE_FILE) restart

restart-api: ## Restart only the api service
	docker compose -f $(DOCKER_COMPOSE_FILE) restart api

restart-worker: ## Restart only the worker service
	docker compose -f $(DOCKER_COMPOSE_FILE) restart worker

restart-scheduler: ## Restart only the scheduler service
	docker compose -f $(DOCKER_COMPOSE_FILE) restart scheduler

restart-reverb: ## Restart only the reverb service
	docker compose -f $(DOCKER_COMPOSE_FILE) restart reverb

ps: ## Show status of all docker services
	docker compose -f $(DOCKER_COMPOSE_FILE) ps --format "table {{.ID}}\t{{.Name}}\t{{.Status}}\t{{.Ports}}"

logs: ## Show logs for all services (tail 500 lines, follow)
	docker compose -f $(DOCKER_COMPOSE_FILE) logs -f --tail=500

logs-api: ## Show logs for api service
	docker compose -f $(DOCKER_COMPOSE_FILE) logs -f --tail=500 api

logs-worker: ## Show logs for worker service
	docker compose -f $(DOCKER_COMPOSE_FILE) logs -f --tail=500 worker

logs-scheduler: ## Show logs for scheduler service
	docker compose -f $(DOCKER_COMPOSE_FILE) logs -f --tail=500 scheduler

logs-reverb: ## Show logs for reverb service
	docker compose -f $(DOCKER_COMPOSE_FILE) logs -f --tail=500 reverb

logs-proxy: ## Show logs for proxy service
	docker compose -f $(DOCKER_COMPOSE_FILE) logs -f --tail=500 proxy

logs-db: ## Show logs for database service
	docker compose -f $(DOCKER_COMPOSE_FILE) logs -f --tail=500 database

logs-redis: ## Show logs for redis service
	docker compose -f $(DOCKER_COMPOSE_FILE) logs -f --tail=500 redis
logs-migrate: ## Show logs for migrate service
	docker compose -f $(DOCKER_COMPOSE_FILE) logs -f --tail=500 migrate

# =============================================================================
# Docker Exec Commands
# =============================================================================

shell: ## Access api container bash shell
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api bash

tinker: ## Start Laravel tinker in api container
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan tinker

artisan: ## Run artisan command (usage: make artisan CMD="migrate:status")
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan $(CMD)

composer: ## Run composer command (usage: make composer CMD="install")
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api composer $(CMD)

npm: ## Run npm command (usage: make npm CMD="install")
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api npm $(CMD)

# =============================================================================
# Laravel Application Commands (via Docker)
# =============================================================================

migrate: ## Run database migrations
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan migrate

migrate-fresh: ## Fresh database migration with seeding
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan migrate:fresh --seed

seed: ## Run database seeders
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan db:seed

queue-work: ## Start queue worker (default,imports)
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan queue:work --queue=default,imports

queue-feed: ## Start queue worker for module-feed
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan queue:work --queue=module-feed

queue-all: ## Start queue worker for all queues
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan queue:work --queue=spatie-media-library,default,imports

media-regenerate-thumb: ## Regenerate image thumbnails
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan media-library:regenerate --only=thumb

cache-clear: ## Clear all cache
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan optimize:clear
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan permission:cache-reset
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan icons:clear

cache: ## Optimize and cache application
	@make cache-clear
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan optimize
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan filament:cache-components
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan icons:cache

assets: ## Build frontend assets
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api php artisan icons:cache
	npm run build

test: ## Run tests
	docker compose -f $(DOCKER_COMPOSE_FILE) exec api ./vendor/bin/pest

# =============================================================================
# Utility Commands
# =============================================================================

clean: ## Clean up docker containers, images, and volumes
	docker compose -f $(DOCKER_COMPOSE_FILE) down -v
	docker system prune -f

status: ## Show comprehensive system status
	@echo "=== Docker Compose Status ==="
	@make ps
	@echo "\n=== Docker Images ==="
	@docker images | grep -E "shams|adminer|postgis|redis" || echo "No shams images found"
	@echo "\n=== Docker Volumes ==="
	@docker volume ls | grep $(shell basename $(PWD)) || echo "No project volumes found"

health: ## Check health of all services
	@echo "=== Service Health Check ==="
	@docker compose -f $(DOCKER_COMPOSE_FILE) ps --format "table {{.Name}}\t{{.Status}}\t{{.Ports}}"