#!/bin/bash

# Property Inspection App - Installation Script
# Run this script as root or with sudo privileges

set -e  # Exit on any error

echo "🚀 Starting Property Inspection App Installation..."

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

# Function to print colored output
print_status() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# Check if running as root
if [[ $EUID -eq 0 ]]; then
   print_error "This script should not be run as root. Please run as a regular user with sudo privileges."
   exit 1
fi

# Update system packages
print_status "Updating system packages..."
sudo apt update && sudo apt upgrade -y

# Install required packages
print_status "Installing required packages..."
sudo apt install -y python3 python3-pip python3-venv nodejs npm nginx git curl

# Install PM2 globally
print_status "Installing PM2 process manager..."
sudo npm install -g pm2

# Create application user if it doesn't exist
if ! id "propinspect" &>/dev/null; then
    print_status "Creating application user 'propinspect'..."
    sudo useradd -m -s /bin/bash propinspect
    sudo usermod -aG sudo propinspect
else
    print_status "User 'propinspect' already exists."
fi

# Create application directories
print_status "Creating application directories..."
sudo mkdir -p /home/propinspect/app/{backend,frontend,uploads,logs,backups}
sudo chown -R propinspect:propinspect /home/propinspect/app

# Copy application files
print_status "Copying application files..."
sudo cp -r backend/* /home/propinspect/app/backend/
sudo cp -r frontend/* /home/propinspect/app/frontend/
sudo cp config/nginx.conf /etc/nginx/sites-available/property-inspection
sudo chown -R propinspect:propinspect /home/propinspect/app

# Setup backend
print_status "Setting up backend..."
cd /home/propinspect/app/backend
sudo -u propinspect python3 -m venv venv
sudo -u propinspect bash -c "source venv/bin/activate && pip install -r requirements.txt"

# Setup environment file
if [ ! -f /home/propinspect/app/backend/.env ]; then
    print_status "Creating environment configuration..."
    sudo -u propinspect cp .env.example .env
    
    # Generate a random secret key
    SECRET_KEY=$(python3 -c 'import secrets; print(secrets.token_hex(32))')
    sudo -u propinspect sed -i "s/your-secret-key-change-this-in-production/$SECRET_KEY/" .env
    
    print_warning "Please review and update /home/propinspect/app/backend/.env with your specific configuration."
fi

# Initialize database
print_status "Initializing database..."
cd /home/propinspect/app/backend
sudo -u propinspect bash -c "source venv/bin/activate && python -c 'from src.models.user_email import db; from src.main import create_app; app = create_app(); app.app_context().push(); db.create_all()'"

# Setup frontend
print_status "Setting up frontend..."
cd /home/propinspect/app/frontend
sudo -u propinspect npm install
sudo -u propinspect npm run build

# Configure Nginx
print_status "Configuring Nginx..."
sudo ln -sf /etc/nginx/sites-available/property-inspection /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default

# Test Nginx configuration
if sudo nginx -t; then
    print_status "Nginx configuration is valid."
else
    print_error "Nginx configuration test failed. Please check the configuration."
    exit 1
fi

# Start services
print_status "Starting services..."
cd /home/propinspect/app/backend
sudo -u propinspect pm2 start ecosystem.config.js
sudo -u propinspect pm2 save
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u propinspect --hp /home/propinspect

# Restart Nginx
sudo systemctl restart nginx
sudo systemctl enable nginx

# Set up log rotation
print_status "Setting up log rotation..."
sudo tee /etc/logrotate.d/property-inspection > /dev/null <<EOF
/home/propinspect/app/logs/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 644 propinspect propinspect
    postrotate
        sudo -u propinspect pm2 reload all
    endscript
}
EOF

# Create backup script
print_status "Creating backup script..."
sudo tee /home/propinspect/app/backup.sh > /dev/null <<'EOF'
#!/bin/bash
BACKUP_DIR="/home/propinspect/app/backups"
DATE=$(date +%Y%m%d_%H%M%S)
cp /home/propinspect/app/backend/property_inspection.db "$BACKUP_DIR/property_inspection_$DATE.db"
find "$BACKUP_DIR" -name "*.db" -mtime +30 -delete
EOF

sudo chmod +x /home/propinspect/app/backup.sh
sudo chown propinspect:propinspect /home/propinspect/app/backup.sh

# Add daily backup to crontab
(sudo -u propinspect crontab -l 2>/dev/null; echo "0 2 * * * /home/propinspect/app/backup.sh") | sudo -u propinspect crontab -

print_status "Installation completed successfully! 🎉"
echo ""
print_status "Next steps:"
echo "1. Update your domain name in /etc/nginx/sites-available/property-inspection"
echo "2. Review configuration in /home/propinspect/app/backend/.env"
echo "3. Restart Nginx: sudo systemctl restart nginx"
echo "4. Check service status: sudo -u propinspect pm2 status"
echo "5. Set up SSL certificate with: sudo certbot --nginx -d yourdomain.com"
echo ""
print_status "Application should be accessible at: http://your-domain.com"
print_status "Logs can be viewed with: sudo -u propinspect pm2 logs"

