#!/bin/bash
# setup.sh
# AutoWorkflow - Full Setup Script
# This script sets up the complete workflow system for any project

set -e

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'

print_banner() {
    echo ""
    echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}"
    echo -e "${CYAN}║                                                              ║${NC}"
    echo -e "${CYAN}║              AUTOWORKFLOW SETUP                              ║${NC}"
    echo -e "${CYAN}║              System Prompt Layer for Claude Code             ║${NC}"
    echo -e "${CYAN}║                                                              ║${NC}"
    echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}"
    echo ""
}

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
TARGET_DIR="${1:-.}"

print_banner

echo -e "${BLUE}Target directory: $TARGET_DIR${NC}"
echo ""

# Navigate to target
cd "$TARGET_DIR"

# Step 1: Check prerequisites
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Step 1: Checking prerequisites"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

if [ ! -f "package.json" ]; then
    echo -e "${YELLOW}⚠️  No package.json found. Creating minimal one...${NC}"
    echo '{"name": "my-project", "version": "1.0.0", "private": true, "type": "module", "scripts": {}}' > package.json
fi
echo -e "${GREEN}✓ package.json exists${NC}"

# Step 2: Create directory structure
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Step 2: Creating directory structure"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

mkdir -p .claude/commands scripts hooks src
echo -e "${GREEN}✓ Created directories${NC}"

# Step 3: Copy workflow files if source exists
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Step 3: Installing workflow files"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

# Copy from project root if available
if [ -f "$PROJECT_ROOT/CLAUDE.md" ]; then
    cp "$PROJECT_ROOT/CLAUDE.md" ./CLAUDE.md 2>/dev/null && echo -e "${GREEN}✓ Installed CLAUDE.md${NC}"
fi

if [ -d "$PROJECT_ROOT/system" ]; then
    cp -r "$PROJECT_ROOT/system" ./ 2>/dev/null && echo -e "${GREEN}✓ Installed system/ folder${NC}"
fi

if [ -d "$PROJECT_ROOT/instructions" ]; then
    cp -r "$PROJECT_ROOT/instructions" ./ 2>/dev/null && echo -e "${GREEN}✓ Installed instructions/ folder${NC}"
fi

if [ -d "$PROJECT_ROOT/.claude" ]; then
    cp -r "$PROJECT_ROOT/.claude/"* ./.claude/ 2>/dev/null && echo -e "${GREEN}✓ Installed .claude/ commands${NC}"
fi

if [ -d "$PROJECT_ROOT/.vscode" ]; then
    mkdir -p .vscode
    cp -r "$PROJECT_ROOT/.vscode/"* ./.vscode/ 2>/dev/null && echo -e "${GREEN}✓ Installed .vscode/ settings${NC}"
fi

# Step 4: Install Git hooks
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Step 4: Installing Git hooks"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

# Initialize git if needed
if [ ! -d ".git" ]; then
    git init
    echo -e "${GREEN}✓ Initialized git repository${NC}"
fi

# Copy hooks
mkdir -p .git/hooks
if [ -d "$PROJECT_ROOT/hooks" ]; then
    cp "$PROJECT_ROOT/hooks/"* .git/hooks/ 2>/dev/null
    chmod +x .git/hooks/* 2>/dev/null
    echo -e "${GREEN}✓ Installed pre-commit hook${NC}"
    echo -e "${GREEN}✓ Installed commit-msg hook${NC}"
fi

# Step 5: Add npm scripts
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Step 5: Adding npm scripts"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

# Add scripts using Node.js
node -e "
const fs = require('fs');
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
pkg.scripts = pkg.scripts || {};

// Verification commands
pkg.scripts['typecheck'] = pkg.scripts['typecheck'] || 'tsc --noEmit';
pkg.scripts['lint'] = pkg.scripts['lint'] || 'eslint . --max-warnings 0';
pkg.scripts['lint:fix'] = pkg.scripts['lint:fix'] || 'eslint . --fix';
pkg.scripts['verify'] = 'npm run typecheck && npm run lint';
pkg.scripts['verify:full'] = 'npm run verify && npm run test';

// Formatting
pkg.scripts['format'] = pkg.scripts['format'] || 'prettier --write .';
pkg.scripts['format:check'] = pkg.scripts['format:check'] || 'prettier --check .';

// Audit commands
pkg.scripts['audit:ui'] = './scripts/check-ui-enforcement.sh';
pkg.scripts['audit:cycles'] = 'npx madge --circular --extensions ts,tsx src/ 2>/dev/null || echo \"No circular dependencies found\"';
pkg.scripts['audit:all'] = 'npm run audit:ui && npm run audit:cycles';

// Workflow commands
pkg.scripts['dyad:status'] = './scripts/autoworkflow.sh status';
pkg.scripts['dyad:verify'] = './scripts/autoworkflow.sh verify';
pkg.scripts['dyad:commit'] = './scripts/autoworkflow.sh commit';
pkg.scripts['dyad:full'] = './scripts/autoworkflow.sh full';

// Hook setup
pkg.scripts['setup:hooks'] = 'cp hooks/* .git/hooks/ 2>/dev/null && chmod +x .git/hooks/* 2>/dev/null || true';
pkg.scripts['postinstall'] = 'npm run setup:hooks 2>/dev/null || true';

fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n');
" 2>/dev/null && echo -e "${GREEN}✓ Added npm scripts${NC}" || echo -e "${YELLOW}⚠️  Could not auto-update package.json${NC}"

# Step 6: Copy scripts
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Step 6: Installing automation scripts"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

if [ -d "$PROJECT_ROOT/scripts" ]; then
    cp "$PROJECT_ROOT/scripts/"*.sh ./scripts/ 2>/dev/null
    chmod +x ./scripts/*.sh 2>/dev/null
    echo -e "${GREEN}✓ Installed automation scripts${NC}"
fi

# Step 7: Final verification
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Step 7: Verifying installation"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

echo "Checking installed files:"
[ -f "CLAUDE.md" ] && echo -e "  ${GREEN}✓${NC} CLAUDE.md" || echo -e "  ${YELLOW}○${NC} CLAUDE.md (optional)"
[ -d "system" ] && echo -e "  ${GREEN}✓${NC} system/" || echo -e "  ${YELLOW}○${NC} system/ (optional)"
[ -d "instructions" ] && echo -e "  ${GREEN}✓${NC} instructions/" || echo -e "  ${YELLOW}○${NC} instructions/ (optional)"
[ -d ".claude/commands" ] && echo -e "  ${GREEN}✓${NC} .claude/commands/" || echo -e "  ${YELLOW}○${NC} .claude/commands/"
[ -f ".git/hooks/pre-commit" ] && echo -e "  ${GREEN}✓${NC} pre-commit hook" || echo -e "  ${YELLOW}○${NC} pre-commit hook"
[ -f ".git/hooks/commit-msg" ] && echo -e "  ${GREEN}✓${NC} commit-msg hook" || echo -e "  ${YELLOW}○${NC} commit-msg hook"
[ -d "scripts" ] && echo -e "  ${GREEN}✓${NC} scripts/" || echo -e "  ${YELLOW}○${NC} scripts/"

echo ""
echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║                                                              ║${NC}"
echo -e "${GREEN}║     ✅ SETUP COMPLETE                                        ║${NC}"
echo -e "${GREEN}║                                                              ║${NC}"
echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo "Next steps:"
echo ""
echo "  1. Install dependencies:"
echo "     ${CYAN}npm install${NC}"
echo ""
echo "  2. Start developing with Claude Code:"
echo "     ${CYAN}code .${NC}"
echo ""
echo "  3. Claude will automatically:"
echo "     • Follow the workflow in CLAUDE.md"
echo "     • Verify after every change"
echo "     • Fix errors before committing"
echo "     • Enforce UI completeness"
echo ""
echo "Available commands:"
echo "  ${CYAN}npm run verify${NC}        - TypeScript + ESLint check"
echo "  ${CYAN}npm run audit:all${NC}     - UI enforcement + circular deps"
echo "  ${CYAN}npm run dyad:full${NC}     - Full workflow"
echo ""
