.PHONY: help install dev-services dev-stop-services dev-backend dev-frontend dev build test lint clean up down restart logs celery-worker celery-beat celery-flower celery-shell

IMAGE_NAME = my-flask-react-app

# Git Remotes
ORIGIN_REMOTE = origin
DEPLOY_REMOTE = deploy

# Get current git commit hash
GIT_HASH = $(shell git rev-parse --short HEAD)
GIT_BRANCH = $(shell git rev-parse --abbrev-ref HEAD)

help: ## Show this help message
	@echo "Available commands:"
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-20s\033[0m %s\n", $$1, $$2}'

install: ## Install dependencies
	@echo "Installing backend dependencies..."
	cd backend && python3 -m venv venv
	. backend/venv/bin/activate && pip install -r backend/requirements/dev.txt
	@echo "Installing frontend dependencies..."
	cd frontend && npm install

dev-backend-install:
	@echo "Installing backend dependencies..."
	. backend/venv/bin/activate && pip install -r backend/requirements/dev.txt
	
dev-services: ## Start development services (postgres & redis only)
	@echo "Starting development services (postgres & redis)..."
	docker compose -f docker-compose.dev.yml up -d

dev-stop-services: ## Stop development services
	@echo "Stopping development services..."
	docker compose -f docker-compose.dev.yml down

dev-backend: ## Start backend server locally
	@echo "Starting backend server..."
	cd backend && . venv/bin/activate && flask run

dev-frontend: ## Start frontend server locally
	@echo "Starting frontend server..."
	cd frontend && npm run dev

dev: ## Start development environment
	@echo "Starting development environment..."
	docker-compose -f docker-compose.dev.yml up -d
	@echo "In one terminal run: make dev-backend"
	@echo "In another terminal run: make dev-frontend"

build: ## Build Docker images
	@echo "Building Docker images..."
	docker compose build

up: ## Start all services
	@echo "Starting all services..."
	docker compose up -d

down: ## Stop all services
	@echo "Stopping all services..."
	docker compose down

restart: ## Restart all services
	@echo "Restarting all services..."
	docker compose restart

logs: ## Show logs from all services
	docker compose logs -f

dev-logs: ## Show logs from all services
	docker compose -f docker-compose.dev.yml logs

test: ## Run all tests
	@echo "Running backend tests..."
	cd backend && . venv/bin/activate && pytest
	@echo "Running frontend tests..."
	cd frontend && npm test

test-backend: ## Run backend tests only
	cd backend && . venv/bin/activate && pytest

test-backend-cov: ## Run backend tests with coverage
	cd backend && . venv/bin/activate && pytest --cov=app --cov-report=html --cov-report=term

test-backend-verbose: ## Run backend tests with verbose output
	cd backend && . venv/bin/activate && pytest -v

test-backend-unit: ## Run backend unit tests only
	cd backend && . venv/bin/activate && pytest -m unit

test-backend-integration: ## Run backend integration tests only
	cd backend && . venv/bin/activate && pytest -m integration

test-backend-auth: ## Run backend authentication tests only
	cd backend && . venv/bin/activate && pytest -m auth

test-backend-product: ## Run backend product tests only
	cd backend && . venv/bin/activate && pytest -m product

test-backend-order: ## Run backend order tests only
	cd backend && . venv/bin/activate && pytest -m order

test-frontend: ## Run frontend tests only
	cd frontend && npm test

lint: ## Run linting
	@echo "Linting backend..."
	cd backend && . venv/bin/activate && flake8 app tests
	@echo "Linting frontend..."
	cd frontend && npm run lint

lint-backend: ## Lint backend only
	cd backend && . venv/bin/activate && flake8 app tests

lint-frontend: ## Lint frontend only
	cd frontend && npm run lint

format: ## Format code
	@echo "Formatting backend..."
	cd backend && . venv/bin/activate && black app tests
	cd backend && . venv/bin/activate && isort app tests
	@echo "Formatting frontend..."
	cd frontend && npx prettier --write "src/**/*.{js,jsx,ts,tsx,css}"

format-backend: ## Format backend code only
	@echo "Formatting backend with black..."
	cd backend && . venv/bin/activate && black app tests
	@echo "Sorting imports with isort..."
	cd backend && . venv/bin/activate && isort app tests

format-backend-check: ## Check if backend code needs formatting
	@echo "Checking backend formatting..."
	cd backend && . venv/bin/activate && black --check app tests
	cd backend && . venv/bin/activate && isort --check-only app tests

format-frontend: ## Format frontend code only
	@echo "Formatting frontend..."
	cd frontend && npx prettier --write "src/**/*.{js,jsx,ts,tsx,css}"

backend-upgrade: ## Run database migrations
	cd backend && . venv/bin/activate && flask db upgrade

shell: ## Open Flask shell
	cd backend && . venv/bin/activate && flask shell

clean: ## Clean up build artifacts
	@echo "Cleaning up..."
	cd backend && rm -rf __pycache__ *.pyc .pytest_cache
	cd frontend && rm -rf dist node_modules/.cache

prune: ## Remove unused Docker resources
	docker system prune -a

backup: ## Backup database
	docker exec crafting-shop-postgres pg_dump -U crafting crafting_shop > backup.sql

restore: ## Restore database (usage: make restore FILE=backup.sql)
	docker exec -i crafting-shop-postgres psql -U crafting crafting_shop < $(FILE)

# Celery Commands
celery-worker: ## Start Celery worker locally
	@echo "Starting Celery worker..."
	cd backend && . venv/bin/activate && celery -A celery_worker worker --loglevel=info --concurrency=4

celery-beat: ## Start Celery Beat scheduler locally
	@echo "Starting Celery Beat scheduler..."
	cd backend && . venv/bin/activate && celery -A celery_worker beat --loglevel=info

celery-flower: ## Start Flower monitoring locally
	@echo "Starting Flower monitoring..."
	cd backend && . venv/bin/activate && celery -A celery_worker flower --port=5555

celery-shell: ## Open Celery shell for task inspection
	@echo "Opening Celery shell..."
	cd backend && . venv/bin/activate && celery -A celery_worker shell

logs-celery: ## Show Celery worker logs
	docker compose logs -f celery_worker

logs-celery-beat: ## Show Celery Beat logs
	docker compose logs -f celery_beat

logs-flower: ## Show Flower logs
	docker compose logs -f flower

docker-build: ## Show Flower logs
		docker build -f docker/Dockerfile -t $(IMAGE_NAME):$(GIT_HASH) -t $(IMAGE_NAME):latest .

docker-run: ## Show Flower logs
	docker run -p 8001:8000 $(IMAGE_NAME):latest

# Push to deploy remote (triggers deployment)
push-deploy:
	@echo "Pushing to deploy remote ($(GIT_BRANCH))..."
	git push $(DEPLOY_REMOTE) $(GIT_BRANCH)

# Push to deploy remote (triggers deployment)
push-deploy-force:
	@echo "Pushing to deploy remote ($(GIT_BRANCH))..."
	git push $(DEPLOY_REMOTE) $(GIT_BRANCH) --force-with-lease