#!/usr/bin/env bash

# ==============================================================================
# Blastup Setup Script
# Developed by Kalp Intelligence (https://kalpintelligence.com)
# ==============================================================================

set -e

# Colors for terminal output
BOLD='\030[1m'
GREEN='\033[0;32m'
CYAN='\033[0;36m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

echo -e "${CYAN}"
echo "=========================================================================="
echo "      🚀 BLASTUP — Open-Source WhatsApp Automation Platform 🚀"
echo "          Developed by Kalp Intelligence (https://kalpintelligence.com)"
echo "=========================================================================="
echo -e "${NC}"

# Function to generate secure random hex string
generate_random_secret() {
  if command -v openssl >/dev/null 2>&1; then
    openssl rand -hex 32
  else
    head -c 32 /dev/urandom | xxd -p | tr -d '\n'
  fi
}

# 1. PREREQUISITE CHECKS
echo -e "${BOLD}[1/4] Checking Prerequisites...${NC}"

if ! command -v node >/dev/null 2>&1; then
  echo -e "${RED}Error: Node.js is not installed. Please install Node.js >= 18.0.0.${NC}"
  exit 1
fi

NODE_VER=$(node -v | cut -d 'v' -f 2 | cut -d '.' -f 1)
if [ "$NODE_VER" -lt 18 ]; then
  echo -e "${RED}Error: Node.js version 18 or higher is required. Found: $(node -v)${NC}"
  exit 1
fi

echo -e "  ${GREEN}✓ Node.js $(node -v) detected.${NC}"

if ! command -v npm >/dev/null 2>&1; then
  echo -e "${RED}Error: npm is not installed.${NC}"
  exit 1
fi
echo -e "  ${GREEN}✓ npm $(npm -v) detected.${NC}"

echo ""

# 2. ENVIRONMENT CONFIGURATION WIZARD
echo -e "${BOLD}[2/4] Configuring Environment Variables (.env)...${NC}"
echo -e "Press ${CYAN}Enter${NC} to accept the default values shown in brackets.\n"

# Server Port
read -p "$(echo -e "Server Port [${CYAN}3001${NC}]: ")" INPUT_PORT
SERVER_PORT=${INPUT_PORT:-3001}

# MongoDB URI
read -p "$(echo -e "MongoDB URI [${CYAN}mongodb://localhost:27017/wa_platform${NC}]: ")" INPUT_MONGO
MONGODB_URI=${INPUT_MONGO:-mongodb://localhost:27017/wa_platform}

# JWT Secret
DEFAULT_JWT_SECRET=$(generate_random_secret)
read -p "$(echo -e "JWT Secret [${CYAN}Auto-generated 64-char hex${NC}]: ")" INPUT_JWT
JWT_SECRET=${INPUT_JWT:-$DEFAULT_JWT_SECRET}

# Cookie Secret
DEFAULT_COOKIE_SECRET=$(generate_random_secret)
read -p "$(echo -e "Cookie Secret [${CYAN}Auto-generated 64-char hex${NC}]: ")" INPUT_COOKIE
COOKIE_SECRET=${INPUT_COOKIE:-$DEFAULT_COOKIE_SECRET}

# Admin Seed Credentials
read -p "$(echo -e "Admin Seed Username [${CYAN}admin${NC}]: ")" INPUT_ADMIN_USER
ADMIN_USERNAME=${INPUT_ADMIN_USER:-admin}

read -p "$(echo -e "Admin Seed Password [${CYAN}admin123${NC}]: ")" INPUT_ADMIN_PASS
ADMIN_PASSWORD=${INPUT_ADMIN_PASS:-admin123}

# Client URLs
read -p "$(echo -e "Client Application URL [${CYAN}http://localhost:3000${NC}]: ")" INPUT_CLIENT_URL
CLIENT_URL=${INPUT_CLIENT_URL:-http://localhost:3000}

read -p "$(echo -e "Backend API URL for Client [${CYAN}http://localhost:3001${NC}]: ")" INPUT_API_URL
NEXT_PUBLIC_API_URL=${INPUT_API_URL:-http://localhost:3001}

# Create server/.env
echo -e "\nWriting ${CYAN}server/.env${NC}..."
cat <<EOF > server/.env
# Generated by Blastup Setup Wizard — Developed by Kalp Intelligence
NODE_ENV=development
PORT=${SERVER_PORT}
MONGODB_URI=${MONGODB_URI}

JWT_SECRET=${JWT_SECRET}
JWT_EXPIRES_IN=24h

COOKIE_SECRET=${COOKIE_SECRET}
BCRYPT_ROUNDS=12

ADMIN_USERNAME=${ADMIN_USERNAME}
ADMIN_PASSWORD=${ADMIN_PASSWORD}

CLIENT_URL=${CLIENT_URL}
UPLOAD_DIR=./uploads
MAX_FILE_SIZE=10485760
SESSION_DIR=./sessions

RATE_LIMIT_WINDOW_MS=900000
RATE_LIMIT_MAX=100
LOGIN_RATE_LIMIT_MAX=5
ACCOUNT_LOCK_DURATION_MINUTES=30
LOG_LEVEL=info
EOF
echo -e "  ${GREEN}✓ server/.env generated successfully.${NC}"

# Create client/.env.local
echo -e "Writing ${CYAN}client/.env.local${NC}..."
cat <<EOF > client/.env.local
# Generated by Blastup Setup Wizard — Developed by Kalp Intelligence
NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL}
EOF
echo -e "  ${GREEN}✓ client/.env.local generated successfully.${NC}"

echo ""

# 3. INSTALLATION OF DEPENDENCIES
echo -e "${BOLD}[3/4] Installing Project Dependencies...${NC}"
read -p "Do you want to run 'npm run install:all' now? (Y/n): " INSTALL_CONFIRM
INSTALL_CONFIRM=${INSTALL_CONFIRM:-Y}

if [[ "$INSTALL_CONFIRM" =~ ^[Yy]$ ]]; then
  echo -e "${CYAN}Installing dependencies across root, server, and client...${NC}"
  npm run install:all
  echo -e "  ${GREEN}✓ All dependencies installed successfully.${NC}"
else
  echo -e "  ${YELLOW}Skipped dependency installation. You can run 'npm run install:all' manually later.${NC}"
fi

echo ""

# 4. DATABASE SEEDING
echo -e "${BOLD}[4/4] Database Initialization & Seeding...${NC}"
read -p "Do you want to seed the database with the admin user (${ADMIN_USERNAME})? (y/N): " SEED_CONFIRM
SEED_CONFIRM=${SEED_CONFIRM:-N}

if [[ "$SEED_CONFIRM" =~ ^[Yy]$ ]]; then
  echo -e "${CYAN}Running database seed script...${NC}"
  npm run seed || echo -e "${YELLOW}Warning: Database seed failed. Make sure MongoDB is running at ${MONGODB_URI}${NC}"
else
  echo -e "  ${YELLOW}Skipped seeding. You can run 'npm run seed' anytime after starting MongoDB.${NC}"
fi

echo ""
echo -e "${GREEN}==========================================================================${NC}"
echo -e "${GREEN}  🎉 Blastup Open-Source Installation & Setup Completed Successfully! 🎉${NC}"
echo -e "${GREEN}==========================================================================${NC}"
echo -e "Developed with ❤️ by ${BOLD}Kalp Intelligence${NC} (https://kalpintelligence.com)\n"
echo -e "To start the development environment:"
echo -e "  ${CYAN}npm run dev${NC}\n"
echo -e "To launch with Docker Compose:"
echo -e "  ${CYAN}docker-compose up -d${NC}\n"
