# Makefile for Ticketing System

# Colors
GREEN=\033[0;32m
NC=\033[0m # No Color

.PHONY: help setup run up down restart logs build install dev db-shell migrate seed reset-db clean deploy-contracts gcp-setup gcp-build gcp-push gcp-deploy

help:
	@echo "Ticketing System Management"
	@echo "Usage: make [target]"
	@echo ""
	@echo "Targets:"
	@echo "  setup              Setup environment files (.env from .env.example)"
	@echo "  run                Start all services (alias for up)"
	@echo "  up                 Start all services with fresh contract deployment"
	@echo "  down               Stop all services"
	@echo "  restart            Restart all services"
	@echo "  logs               Follow logs from all services"
	@echo "  build              Rebuild containers"
	@echo "  install            Install dependencies for backend"
	@echo "  dev                Start backend in development mode (local)"
	@echo "  db-shell           Connect to the PostgreSQL database"
	@echo "  deploy-contracts   Clean and redeploy smart contracts"
	@echo "  clean              Remove containers, networks, and volumes (Use with caution)"
	@echo ""
	@echo "GCP Deployment:"
	@echo "  gcp-setup     Run initial GCP setup script"
	@echo "  gcp-build     Build Docker images for GCP"
	@echo "  gcp-push      Push Docker images to Artifact Registry"
	@echo "  gcp-deploy    Deploy to Cloud Run"

DB_URL := postgresql://postgres:postgres@localhost:5437/ticketing_db

setup:
	@echo "${GREEN}Setting up environment files...${NC}"
	@if [ ! -f backend/.env ]; then \
		echo "Creating backend/.env from .env.example..."; \
		cp backend/.env.example backend/.env; \
		echo "${GREEN}backend/.env created!${NC}"; \
	else \
		echo "backend/.env already exists, skipping..."; \
	fi
	@echo "${GREEN}Setup complete!${NC}"

run: up

up: setup
	@echo "${GREEN}Starting all services (Development)...${NC}"
	docker compose up -d
	@echo "${GREEN}Dev environment operational! Contracts auto-deployed by container.${NC}"

deploy-contracts:
	@echo "${GREEN}Manually redeploying smart contracts...${NC}"
	docker exec ticketing-smart-contract sh -c "rm -rf artifacts cache deployments && npm run compile && npm run deploy:local"
	@echo "${GREEN}Contract deployment complete!${NC}"


prod:
	@echo "${GREEN}Starting all services (Production)...${NC}"
	docker compose -f docker-compose.prod.yml up -d
	@echo "${GREEN}Production environment operational!${NC}"

down:
	@echo "${GREEN}Stopping all services (Development)...${NC}"
	docker compose down

prod-down:
	@echo "${GREEN}Stopping all services (Production)...${NC}"
	docker compose -f docker-compose.prod.yml down

restart: down up

logs:
	docker compose logs -f

logs-prod:
	docker compose -f docker-compose.prod.yml logs -f

build:
	@echo "${GREEN}Building services...${NC}"
	docker compose build

build-prod:
	@echo "${GREEN}Building production services...${NC}"
	docker compose -f docker-compose.prod.yml build

install:
	@echo "${GREEN}Installing backend dependencies...${NC}"
	cd backend && bun install

install-all:
	@echo "${GREEN}Installing all dependencies...${NC}"
	cd backend && bun install
	cd frontend && bun install
	cd smart-contract && bun install

dev:
	@echo "${GREEN}Starting backend in dev mode...${NC}"
	cd backend && bun run dev

db-shell:
	@echo "${GREEN}Connecting to database...${NC}"
	docker exec -it ticketing-postgres psql -U postgres -d ticketing_db

generate:
	@echo "${GREEN}Generating database migrations...${NC}"
	cd backend && DATABASE_URL=${DB_URL} bun run db:generate
	@echo "${GREEN}Migrations generated!${NC}"

migrate:
	@echo "${GREEN}Running database migrations...${NC}"
	cd backend && DATABASE_URL=${DB_URL} bun run db:migrate
	@echo "${GREEN}Migrations complete!${NC}"

seed:
	@echo "${GREEN}Seeding database...${NC}"
	cd backend && DATABASE_URL=${DB_URL} bun run db:seed
	@echo "${GREEN}Seeding complete!${NC}"

reset-db:
	@echo "${GREEN}Resetting database (drop, migrate, seed)...${NC}"
	docker exec ticketing-postgres psql -U postgres -d ticketing_db -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
	cd backend && DATABASE_URL=${DB_URL} bun run db:migrate
	cd backend && DATABASE_URL=${DB_URL} bun run db:seed
	@echo "${GREEN}Database reset complete!${NC}"

clean:
	@echo "${GREEN}Cleaning up Dev (this project only)...${NC}"
	docker compose down -v --remove-orphans
	@echo "${GREEN}Removing project images...${NC}"
	docker compose rm -f
	@echo "${GREEN}Cleanup complete!${NC}"
