# justfile for Euchre Camp
# Automates development, testing, and deployment tasks.
# Designed for CI/CD pipelines and local development.

# --- Configuration ---
set dotenv-load
set positional-arguments

# Project name
PROJECT := "euchre-camp"

# Docker registry
REGISTRY := "docker.notsosm.art"
IMAGE_TAG := "latest"

# Get git commit hash (short version)
GIT_COMMIT := `git rev-parse --short HEAD`

# Image tag with git commit (use same format as GIT_COMMIT)
IMAGE_TAG_COMMIT := `git rev-parse --short HEAD`

# --- Variables ---
# Database
DB_CONTAINER := "euchre-camp-postgres"
DATABASE_URL := env_var_or_default("DATABASE_URL", "")

# --- Setup & Installation ---

# Install dependencies and setup environment
setup:
    @echo "Installing dependencies..."
    npm install
    @echo "Setting up database..."
    npm run db:setup-dev
    @echo "Generating Prisma client..."
    npx prisma generate

# --- Development ---

# Start the development server
dev:
    npm run dev

# Lint the codebase
lint:
    npm run lint

# Type check the codebase
typecheck:
    npx tsc --noEmit

# Format code (if prettier is available, otherwise just lint)
format:
    npx prettier --write .

# --- Testing ---

# Run all tests (unit + acceptance)
test: test-unit test-acceptance

# Run unit tests
test-unit:
    npm run test:run

# Run acceptance tests (Playwright)
test-acceptance:
    @echo "Running acceptance tests..."
    npm run test:acceptance

# Run Cucumber e2e tests
test-cucumber:
    @echo "Clearing Next.js cache..."
    rm -rf .next/
    @echo "Running Cucumber e2e tests..."
    npm run test:acceptance:cucumber

# Run Cucumber e2e tests against production build
test-cucumber-prod:
    @echo "Clearing Next.js cache..."
    rm -rf .next/
    @echo "Building application for production..."
    bun run build
    @echo "Starting production server in background..."
    bun run start > /tmp/next-prod.log 2>&1 &
    SERVER_PID=$$!
    @echo "Waiting for server to be ready..."
    sleep 15
    @echo "Running Cucumber e2e tests against production build..."
    npm run test:acceptance:cucumber || true
    @echo "Stopping production server..."
    kill $$SERVER_PID 2>/dev/null || true
    @echo "Tests completed."

# Run database migrations (Prisma)
migrate:
    npx prisma migrate dev

# Seed the database
seed:
    npm run db:seed

# --- Docker ---

# Build the Docker image (standard build)
docker-build:
    @echo "Building Docker image {{PROJECT}}:{{IMAGE_TAG}}..."
    docker build --build-arg GIT_COMMIT={{GIT_COMMIT}} -t {{PROJECT}}:{{IMAGE_TAG}} .

docker-build-commit:
    @echo "Building Docker image {{PROJECT}}:{{IMAGE_TAG_COMMIT}}..."
    docker build --build-arg GIT_COMMIT={{GIT_COMMIT}} -t {{PROJECT}}:{{IMAGE_TAG_COMMIT}} .

# Build and tag with both latest and commit hash
docker-build-full: docker-build docker-build-commit

# Fast rebuild using Docker BuildKit cache
docker-rebuild-fast:
    @echo "Fast rebuilding Docker image {{PROJECT}}:{{IMAGE_TAG}}..."
    DOCKER_BUILDKIT=1 docker build \
        --build-arg GIT_COMMIT={{GIT_COMMIT}} \
        --cache-from={{PROJECT}}:{{IMAGE_TAG}} \
        -t {{PROJECT}}:{{IMAGE_TAG}} \
        -t {{PROJECT}}:{{IMAGE_TAG_COMMIT}} \
        .

# Run the Docker container locally
docker-run: docker-build
    @echo "Running Docker container {{PROJECT}}..."
    docker run -d -p 3000:3000 --name {{PROJECT}} {{PROJECT}}:{{IMAGE_TAG}}

# Stop and remove the Docker container
docker-stop:
    @echo "Stopping Docker container {{PROJECT}}..."
    docker stop {{PROJECT}} || true
    docker rm {{PROJECT}} || true

# Clean up Docker images and containers
docker-clean: docker-stop
    @echo "Removing Docker image {{PROJECT}}:{{IMAGE_TAG}}..."
    docker rmi {{PROJECT}}:{{IMAGE_TAG}} || true

# --- Deployment ---

# Tag image for registry
docker-tag:
    @echo "Tagging image for registry..."
    docker tag {{PROJECT}}:{{IMAGE_TAG}} {{REGISTRY}}/{{PROJECT}}:{{IMAGE_TAG}} || true
    docker tag {{PROJECT}}:{{IMAGE_TAG_COMMIT}} {{REGISTRY}}/{{PROJECT}}:{{IMAGE_TAG_COMMIT}} || true
    @echo "Tagged {{PROJECT}}:{{IMAGE_TAG}} -> {{REGISTRY}}/{{PROJECT}}:{{IMAGE_TAG}}"
    @echo "Tagged {{PROJECT}}:{{IMAGE_TAG_COMMIT}} -> {{REGISTRY}}/{{PROJECT}}:{{IMAGE_TAG_COMMIT}}"

# Push image to registry (builds, tags, and pushes)
docker-push: docker-build-full
    @echo "Tagging images for registry..."
    docker tag {{PROJECT}}:{{IMAGE_TAG}} {{REGISTRY}}/{{PROJECT}}:{{IMAGE_TAG}} || true
    docker tag {{PROJECT}}:{{IMAGE_TAG_COMMIT}} {{REGISTRY}}/{{PROJECT}}:{{IMAGE_TAG_COMMIT}} || true
    @echo "Pushing images to {{REGISTRY}}..."
    docker push {{REGISTRY}}/{{PROJECT}}:{{IMAGE_TAG}}
    docker push {{REGISTRY}}/{{PROJECT}}:{{IMAGE_TAG_COMMIT}}

# --- CI/CD Pipeline Simulation ---

# Run full CI pipeline locally (lint, test, build)
ci: lint typecheck test-unit test-acceptance docker-build
    @echo "CI Pipeline completed successfully!"

# PR validation (what runs on pull requests)
pr-validate: lint typecheck test-unit test-acceptance
    @echo "PR validation completed successfully!"

# --- Utilities ---

# Show help information
help:
    @just --list

# Clean up project (remove node_modules, build artifacts)
clean:
    @echo "Cleaning project..."
    rm -rf node_modules .next dist .turbo

# Generate Prisma client
prisma-generate:
    npx prisma generate

# Reset development database
db-reset-dev:
    npm run db:reset-dev

# Setup development database
db-setup-dev:
    npm run db:setup-dev

# Clean production database (remove test records)
db-clean-prod:
    npm run db:cleanup-prod

# Check production database for test records
db-check-prod:
    npm run db:check-prod

# Create admin user
admin-create:
    node scripts/create-admin-via-api.js

# List all users
users-list:
    node scripts/list-users.js

# Update admin password
admin-update-password:
    node scripts/update-admin-password.js

# Bump version
version-bump-patch:
    npm run version:patch

version-bump-minor:
    npm run version:minor

version-bump-major:
    npm run version:major

# Docker Compose shortcuts
docker-up:
    npm run docker:up

docker-down:
    npm run docker:down

docker-logs:
    npm run docker:logs

# View workflow status
workflow-status:
    @echo "Current workflows in .gitea/workflows/:"
    ls -la .gitea/workflows/
    @echo ""
    @echo "PR Workflow: Runs unit + acceptance tests on pull requests"
    @echo "Test Workflow: Runs unit tests on all branch pushes"
    @echo "Release Workflow: Runs on main branch pushes (version bump + Docker build)"

# --- Production Deployment ---

# Deploy a specific version to production (human gate)
# Usage: just deploy-prod v0.1.21
deploy-prod version:
    @echo "Deploying {{version}} to production..."
    @echo "This requires the image to already be pushed to the registry."
    @echo ""
    @read -p "Have you verified this version works in dev? (y/N) " confirm; \
    if [ "$$confirm" != "y" ]; then \
      echo "Cancelled. Please verify in dev first."; \
      exit 1; \
    fi
    cd /apps/youthful_simon && \
    sed -i "s|image: docker.notsosm.art/euchre-camp:[a-zA-Z0-9.-]*|image: docker.notsosm.art/euchre-camp:{{version}}|" docker-compose.yml && \
    sed -i "s|image: euchre-camp/euchre-camp:[a-zA-Z0-9.-]*|image: docker.notsosm.art/euchre-camp:{{version}}|" docker-compose.yml && \
    docker compose pull app && \
    docker compose up -d app && \
    echo "Waiting for production site to be healthy..." && \
    for i in {1..6}; do \
      if curl -sf https://euchre.notsosm.art/api/health > /dev/null 2>&1; then \
        echo "✅ Production successfully deployed with version {{version}}"; \
        exit 0; \
      fi; \
      sleep 15; \
    done && \
    echo "❌ Production deployment failed - health check timed out"; \
    docker compose logs app; \
    exit 1

# Show current deployment status across all environments
status:
    @echo "=== EuchreCamp Deployment Status ==="
    @echo ""
    @echo "CI Site (euchre-camp-ci):"
    @grep "image:" /apps/euchre_camp_ci/docker-compose.yml | head -1
    @echo ""
    @echo "Dev Site (euchre-camp-dev):"
    @grep "image:" /apps/intelligent_silasak/docker-compose.yml | head -1
    @echo ""
    @echo "Prod Site (euchre-camp):"
    @grep "image:" /apps/youthful_simon/docker-compose.yml | head -1
    @echo ""

# --- SDLC Database Operations ---

# Sync production data to development database (manual operation)
sync-dev:
    @echo "Syncing production data to development database..."
    node scripts/sync-prod-to-dev.js

# Run acceptance tests against production database (opt-in, manual)
test-prod:
    @echo "⚠️  WARNING: This will run tests against the PRODUCTION database!"
    @echo "   All test records will be cleaned up after the run."
    @echo ""
    @read -p "Are you sure you want to continue? (y/N) " confirm; \
    if [ "$$confirm" != "y" ]; then \
      echo "Cancelled."; \
    else \
      DATABASE_URL="$$PROD_DATABASE_URL" bun test:acceptance; \
    fi

# Reset CI database (for local CI testing)
reset-ci-db:
    @echo "Resetting CI database..."
    psql "$CI_DATABASE_URL" -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
    bunx prisma migrate deploy
