#!/bin/bash

# ========================================
# EzyGas Paperclip Deployment Script
# Hostinger VPS Setup (Ubuntu 24.04 with Docker)
# ========================================

set -e

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

# Configuration
DEPLOYMENT_DIR="/opt/ezygas"
GITHUB_REPO="https://github.com/paperclipai/paperclip"
GITHUB_BRANCH="main"

echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}EzyGas Paperclip Deployment${NC}"
echo -e "${GREEN}========================================${NC}"

# ========================================
# PRE-FLIGHT CHECKS
# ========================================
echo -e "\n${YELLOW}[1/10] Running pre-flight checks...${NC}"

# Check if running as root
if [ "$EUID" -ne 0 ]; then 
  echo -e "${RED}Error: This script must be run as root${NC}"
  exit 1
fi

# Check Ubuntu version
if ! grep -q "24.04" /etc/os-release; then
  echo -e "${YELLOW}Warning: This script is optimized for Ubuntu 24.04${NC}"
fi

# Check if Docker is installed
if ! command -v docker &> /dev/null; then
  echo -e "${RED}Docker not found. Installing Docker...${NC}"
  apt-get update
  apt-get install -y docker.io docker-compose-plugin
fi

# Check if Docker Compose is available
if ! docker compose version &> /dev/null; then
  echo -e "${RED}Docker Compose not found. Please install Docker Compose.${NC}"
  exit 1
fi

echo -e "${GREEN}✓ Pre-flight checks passed${NC}"

# ========================================
# CREATE DEPLOYMENT DIRECTORY
# ========================================
echo -e "\n${YELLOW}[2/10] Creating deployment directory...${NC}"

mkdir -p "$DEPLOYMENT_DIR"
mkdir -p "$DEPLOYMENT_DIR/data/paperclip-config"
mkdir -p "$DEPLOYMENT_DIR/backups"
mkdir -p "$DEPLOYMENT_DIR/logs"
mkdir -p "$DEPLOYMENT_DIR/ssl"
mkdir -p "$DEPLOYMENT_DIR/html"

cd "$DEPLOYMENT_DIR"
echo -e "${GREEN}✓ Deployment directory created at $DEPLOYMENT_DIR${NC}"

# ========================================
# CLONE PAPERCLIP REPOSITORY
# ========================================
echo -e "\n${YELLOW}[3/10] Cloning Paperclip repository...${NC}"

if [ ! -d "$DEPLOYMENT_DIR/paperclip" ]; then
  git clone --branch "$GITHUB_BRANCH" "$GITHUB_REPO" paperclip
  echo -e "${GREEN}✓ Repository cloned${NC}"
else
  echo -e "${YELLOW}Repository already exists, skipping clone${NC}"
fi

# ========================================
# COPY CONFIGURATION FILES
# ========================================
echo -e "\n${YELLOW}[4/10] Setting up configuration files...${NC}"

# Copy docker-compose (will be provided by user)
if [ ! -f "$DEPLOYMENT_DIR/docker-compose.yml" ]; then
  echo -e "${RED}docker-compose.yml not found at $DEPLOYMENT_DIR/docker-compose.yml${NC}"
  echo -e "${YELLOW}Please copy docker-compose.yml to the deployment directory${NC}"
  exit 1
fi

# Copy nginx config
if [ ! -f "$DEPLOYMENT_DIR/nginx.conf" ]; then
  echo -e "${RED}nginx.conf not found at $DEPLOYMENT_DIR/nginx.conf${NC}"
  echo -e "${YELLOW}Please copy nginx.conf to the deployment directory${NC}"
  exit 1
fi

# Copy backup script
if [ ! -f "$DEPLOYMENT_DIR/backup.sh" ]; then
  echo -e "${RED}backup.sh not found at $DEPLOYMENT_DIR/backup.sh${NC}"
  echo -e "${YELLOW}Please copy backup.sh to the deployment directory${NC}"
  exit 1
fi

chmod +x "$DEPLOYMENT_DIR/backup.sh"

# Copy EzyGas company config
if [ ! -f "$DEPLOYMENT_DIR/ezygas-config.json" ]; then
  echo -e "${RED}ezygas-config.json not found at $DEPLOYMENT_DIR/ezygas-config.json${NC}"
  echo -e "${YELLOW}Please copy ezygas-config.json to the deployment directory${NC}"
  exit 1
fi

echo -e "${GREEN}✓ Configuration files in place${NC}"

# ========================================
# CREATE ENVIRONMENT FILE
# ========================================
echo -e "\n${YELLOW}[5/10] Creating environment file...${NC}"

if [ ! -f "$DEPLOYMENT_DIR/.env" ]; then
  # Copy template and prompt for values
  if [ -f "$DEPLOYMENT_DIR/.env.template" ]; then
    cp "$DEPLOYMENT_DIR/.env.template" "$DEPLOYMENT_DIR/.env"
    echo -e "${YELLOW}❌ CRITICAL: Edit .env file with your actual values:${NC}"
    echo -e "${YELLOW}   - ANTHROPIC_API_KEY (required)${NC}"
    echo -e "${YELLOW}   - PAPERCLIP_SECRET_KEY${NC}"
    echo -e "${YELLOW}   - Database passwords${NC}"
    echo -e "${YELLOW}   - Domain name${NC}"
    echo ""
    echo -e "${YELLOW}Edit: $DEPLOYMENT_DIR/.env${NC}"
    echo -e "${YELLOW}Then run: docker compose up -d${NC}"
    echo ""
    read -p "Press Enter once you've updated .env with your values: "
  else
    echo -e "${RED}.env.template not found${NC}"
    exit 1
  fi
else
  echo -e "${GREEN}✓ .env file already exists${NC}"
fi

# ========================================
# GENERATE SELF-SIGNED SSL (temporary)
# ========================================
echo -e "\n${YELLOW}[6/10] Setting up SSL certificates...${NC}"

if [ ! -f "$DEPLOYMENT_DIR/ssl/cert.pem" ]; then
  echo -e "${YELLOW}Generating temporary self-signed certificate...${NC}"
  openssl req -x509 -newkey rsa:4096 -keyout "$DEPLOYMENT_DIR/ssl/key.pem" \
    -out "$DEPLOYMENT_DIR/ssl/cert.pem" -days 365 -nodes \
    -subj "/C=EG/ST=Cairo/L=Cairo/O=EzyGas/CN=localhost"
  echo -e "${YELLOW}⚠️  Using self-signed certificate (temporary)${NC}"
  echo -e "${YELLOW}After deployment, obtain Let's Encrypt certificate:${NC}"
  echo -e "${YELLOW}  docker exec ezygas-nginx certbot certonly --webroot${NC}"
else
  echo -e "${GREEN}✓ SSL certificate found${NC}"
fi

# ========================================
# BUILD AND START CONTAINERS
# ========================================
echo -e "\n${YELLOW}[7/10] Building Docker containers...${NC}"

docker compose build --no-cache
echo -e "${GREEN}✓ Containers built${NC}"

echo -e "\n${YELLOW}[8/10] Starting containers...${NC}"

docker compose up -d
echo -e "${GREEN}✓ Containers started${NC}"

# Wait for services to be healthy
echo -e "\n${YELLOW}[9/10] Waiting for services to be healthy...${NC}"

sleep 10

# Check Paperclip health
max_attempts=30
attempt=0
until curl -f http://localhost:3000/health &> /dev/null || [ $attempt -eq $max_attempts ]; do
  echo -n "."
  sleep 2
  ((attempt++))
done

if [ $attempt -eq $max_attempts ]; then
  echo -e "${RED}✗ Paperclip failed to start${NC}"
  echo -e "${YELLOW}Check logs: docker compose logs paperclip${NC}"
  exit 1
fi

echo -e "${GREEN}✓ Services are healthy${NC}"

# ========================================
# IMPORT EZYGAS CONFIGURATION
# ========================================
echo -e "\n${YELLOW}[10/10] Importing EzyGas configuration...${NC}"

# This would normally be done via API, but for now we'll provide instructions
echo -e "${YELLOW}Configuration import steps:${NC}"
echo -e "1. Access Paperclip dashboard at https://$(hostname -I | awk '{print $1}')"
echo -e "2. Login with admin credentials"
echo -e "3. Import ezygas-config.json from: $DEPLOYMENT_DIR/ezygas-config.json"
echo ""

echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}Deployment Complete!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
echo -e "${YELLOW}Next Steps:${NC}"
echo -e "1. Access Paperclip: https://$(hostname -I | awk '{print $1}')"
echo -e "2. Configure your domain in DNS"
echo -e "3. Obtain Let's Encrypt certificate"
echo -e "4. Monitor agent execution: docker compose logs -f paperclip"
echo -e "5. Check budget tracking: View CFO agent reports"
echo ""
echo -e "${YELLOW}Useful Commands:${NC}"
echo -e "  View logs:        docker compose logs -f [service]"
echo -e "  Restart services: docker compose restart"
echo -e "  Stop services:    docker compose down"
echo -e "  View status:      docker compose ps"
echo ""
echo -e "${YELLOW}Backup & Recovery:${NC}"
echo -e "  Manual backup:    $DEPLOYMENT_DIR/backup.sh"
echo -e "  Backups stored:   $DEPLOYMENT_DIR/backups/"
echo -e "  Daily auto-backup: Enabled (via backup service)"
echo ""

# Save deployment info
cat > "$DEPLOYMENT_DIR/DEPLOYMENT_INFO.txt" <<EOF
EzyGas Paperclip Deployment Information
========================================
Deployment Date: $(date)
Deployment Directory: $DEPLOYMENT_DIR
Server IP: $(hostname -I | awk '{print $1}')
Hostname: $(hostname)

Services Running:
  - Paperclip: http://localhost:3000
  - PostgreSQL: postgres:5432
  - Weaviate: http://localhost:8081
  - Nginx: ports 80/443

Initial Credentials (Change in .env):
  - PostgreSQL User: paperclip
  - Weaviate API Key: ezygas-api-key
  - Admin API Key: (set in .env)

Monthly Budget: $1,950 USD
  - CEO: $400
  - HR: $250
  - Supply Chain: $600
  - Gov Relations: $200
  - Content/Brand: $350

Backup Location: $DEPLOYMENT_DIR/backups/
Backup Retention: 30 days
Auto-Backup Schedule: Daily at 02:00 UTC

For support: Check docker compose logs
EOF

echo -e "${GREEN}Deployment info saved to: $DEPLOYMENT_DIR/DEPLOYMENT_INFO.txt${NC}"
