#!/bin/bash

# EAR Project - Staging Deployment Script
# This script sets up the Docker environment for staging deployment

set -e

echo "🚀 EAR Project - Staging Deployment"
echo "=================================="

# Check if Docker and Docker Compose are installed
if ! command -v docker &> /dev/null; then
    echo "❌ Docker is not installed. Please install Docker first."
    exit 1
fi

if ! command -v docker-compose &> /dev/null; then
    echo "❌ Docker Compose is not installed. Please install Docker Compose first."
    exit 1
fi

# Function to generate a random string
generate_random_string() {
    openssl rand -base64 32 | tr -d "=+/" | cut -c1-32
}

# Check if .env file exists, if not copy from staging template
if [ ! -f .env ]; then
    echo "📋 Creating .env file from staging template..."
    cp .env.staging .env
    echo "✅ .env file created"
else
    echo "⚠️  .env file already exists. Skipping creation."
fi

# Generate APP_KEY if not set
if ! grep -q "APP_KEY=base64:" .env; then
    echo "🔑 Generating application key..."
    APP_KEY=$(php -r "echo 'base64:'.base64_encode(random_bytes(32));")
    sed -i.bak "s/APP_KEY=/APP_KEY=$APP_KEY/" .env
    rm .env.bak 2>/dev/null || true
    echo "✅ Application key generated"
fi

# Generate secure database passwords if using defaults
if grep -q "DB_PASSWORD=secure_password" .env; then
    echo "🔐 Generating secure database password..."
    DB_PASSWORD=$(generate_random_string)
    sed -i.bak "s/DB_PASSWORD=secure_password/DB_PASSWORD=$DB_PASSWORD/" .env
    rm .env.bak 2>/dev/null || true
fi

if grep -q "DB_ROOT_PASSWORD=root_password" .env; then
    echo "🔐 Generating secure root password..."
    ROOT_PASSWORD=$(generate_random_string)
    sed -i.bak "s/DB_ROOT_PASSWORD=root_password/DB_ROOT_PASSWORD=$ROOT_PASSWORD/" .env
    rm .env.bak 2>/dev/null || true
fi

# Ask for domain name
echo ""
read -p "🌐 Enter your domain name (or press Enter for localhost): " DOMAIN_NAME
if [ -n "$DOMAIN_NAME" ]; then
    sed -i.bak "s/DOMAIN_NAME=localhost/DOMAIN_NAME=$DOMAIN_NAME/" .env
    sed -i.bak "s|APP_URL=http://localhost|APP_URL=http://$DOMAIN_NAME|" .env
    rm .env.bak 2>/dev/null || true
    echo "✅ Domain name set to: $DOMAIN_NAME"
fi

# Create necessary directories
echo "📁 Creating necessary directories..."
mkdir -p docker/ssl
mkdir -p storage/logs
mkdir -p bootstrap/cache

# Set proper permissions
echo "🔧 Setting proper permissions..."
chmod -R 755 storage bootstrap/cache
chmod +x deploy-staging.sh

# Build and start containers
echo "🐳 Building Docker containers..."
docker-compose down --remove-orphans 2>/dev/null || true
docker-compose build --no-cache

echo "🚀 Starting containers..."
docker-compose up -d

# Wait for database to be ready
echo "⏳ Waiting for database to be ready..."
sleep 30

# Run Laravel setup commands
echo "⚙️  Running Laravel setup commands..."
docker-compose exec -T app php artisan key:generate --force
docker-compose exec -T app php artisan migrate --force
docker-compose exec -T app php artisan config:cache
docker-compose exec -T app php artisan route:cache
docker-compose exec -T app php artisan view:cache
docker-compose exec -T app php artisan storage:link

echo ""
echo "🎉 Deployment completed successfully!"
echo ""
echo "📋 Access Information:"
echo "====================="
if [ -n "$DOMAIN_NAME" ]; then
    echo "🌐 Application URL: http://$DOMAIN_NAME"
else
    echo "🌐 Application URL: http://localhost"
fi
echo "🗄️  Database: MySQL on port 3306"
echo "📊 Redis: Available on port 6379"
echo ""
echo "📝 Useful Commands:"
echo "==================="
echo "• View logs: docker-compose logs -f"
echo "• Stop containers: docker-compose down"
echo "• Restart containers: docker-compose restart"
echo "• Access app container: docker-compose exec app bash"
echo "• Run artisan commands: docker-compose exec app php artisan [command]"
echo ""
echo "⚠️  Note: For production use, consider:"
echo "• Setting up SSL certificates"
echo "• Configuring proper backup strategy"
echo "• Setting up monitoring and logging"
echo "• Reviewing security settings"
