#!/bin/bash

# =============================================================================
# Script: switch_apache_to_php_fpm.sh
# Deskripsi: Mengalihkan Apache2 dari mod_php ke PHP-FPM
# Tested on: Debian 12 (Bookworm) dengan PHP 8.2
# =============================================================================

set -e

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

# Konfigurasi
PHP_VERSION="8.2"
FPM_SOCK="/run/php/php${PHP_VERSION}-fpm.sock"
APACHE_CONF="/etc/apache2/conf-available/php${PHP_VERSION}-fpm.conf"

echo -e "${YELLOW}=================================================${NC}"
echo -e "${YELLOW}  Apache2: Switch dari mod_php ke PHP-FPM${NC}"
echo -e "${YELLOW}=================================================${NC}"
echo ""

# =============================================================================
# 1. Cek apakah script dijalankan sebagai root
# =============================================================================
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}[ERROR]${NC} Script ini harus dijalankan sebagai root atau dengan sudo"
    exit 1
fi

# =============================================================================
# 2. Cek apakah PHP-FPM sudah terinstall
# =============================================================================
echo -e "${YELLOW}[1/7]${NC} Mengecek instalasi PHP-FPM..."
if ! dpkg -l | grep -q "php${PHP_VERSION}-fpm"; then
    echo -e "${RED}[ERROR]${NC} php${PHP_VERSION}-fpm belum terinstall."
    echo "Instalasi terlebih dahulu dengan:"
    echo "  sudo apt update"
    echo "  sudo apt install php${PHP_VERSION}-fpm"
    exit 1
fi
echo -e "${GREEN}[OK]${NC} php${PHP_VERSION}-fpm terinstall"

# =============================================================================
# 3. Cek status PHP-FPM service
# =============================================================================
echo -e "${YELLOW}[2/7]${NC} Mengecek status service PHP-FPM..."
if ! systemctl is-active --quiet php${PHP_VERSION}-fpm; then
    echo -e "${YELLOW}[WARN]${NC} Service php${PHP_VERSION}-fpm tidak aktif. Menyalakan..."
    systemctl start php${PHP_VERSION}-fpm
    systemctl enable php${PHP_VERSION}-fpm
fi
echo -e "${GREEN}[OK]${NC} Service php${PHP_VERSION}-fpm aktif"

# =============================================================================
# 4. Nonaktifkan mod_php
# =============================================================================
echo -e "${YELLOW}[3/7]${NC} Menonaktifkan mod_php..."

# Cek modul php yang aktif
ENABLED_PHP_MODS=$(ls /etc/apache2/mods-enabled/ | grep "^php" || true)

if [ -z "$ENABLED_PHP_MODS" ]; then
    echo -e "${GREEN}[OK]${NC} Tidak ada mod_php yang aktif"
else
    for mod in $ENABLED_PHP_MODS; do
        MOD_NAME=$(echo "$mod" | sed 's/\.conf//;s/\.load//')
        echo "  -> Menonaktifkan: $MOD_NAME"
        a2dismod "$MOD_NAME" >/dev/null 2>&1 || true
    done
    echo -e "${GREEN}[OK]${NC} mod_php dinonaktifkan"
fi

# =============================================================================
# 5. Aktifkan proxy_fcgi dan konfigurasi PHP-FPM
# =============================================================================
echo -e "${YELLOW}[4/7]${NC} Mengaktifkan proxy_fcgi dan konfigurasi PHP-FPM..."

# Aktifkan modul proxy_fcgi
if ! apache2ctl -M 2>/dev/null | grep -q "proxy_fcgi_module"; then
    a2enmod proxy_fcgi >/dev/null 2>&1
    echo -e "${GREEN}[OK]${NC} Modul proxy_fcgsi diaktifkan"
else
    echo -e "${GREEN}[OK]${NC} Modul proxy_fcgi sudah aktif"
fi

# Aktifkan konfigurasi php-fpm jika ada
if [ -f "$APACHE_CONF" ]; then
    a2enconf php${PHP_VERSION}-fpm >/dev/null 2>&1
    echo -e "${GREEN}[OK]${NC} Konfigurasi php${PHP_VERSION}-fpm diaktifkan"
else
    echo -e "${YELLOW}[WARN]${NC} File konfigurasi $APACHE_CONF tidak ditemukan"
    echo "  Membuat konfigurasi manual..."

    cat > "$APACHE_CONF" <<EOF
# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php${PHP_VERSION}.c>
<IfModule proxy_fcgi_module>
    # Enable http authorization headers
    <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization\$ "(.+)" HTTP_AUTHORIZATION=\$1
    </IfModule>

    <FilesMatch "\\.ph(?:ar|p|tml)\$">
        SetHandler "proxy:unix:${FPM_SOCK}|fcgi://localhost"
    </FilesMatch>

    <FilesMatch ".\\.phps\$">
        Require all denied
    </FilesMatch>

    <FilesMatch "^\\.ph(?:ar|p|ps|tml)\$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>
EOF

    a2enconf php${PHP_VERSION}-fpm >/dev/null 2>&1
    echo -e "${GREEN}[OK]${NC} Konfigurasi manual dibuat dan diaktifkan"
fi

# =============================================================================
# 6. Verifikasi konfigurasi Apache
# =============================================================================
echo -e "${YELLOW}[5/7]${NC} Memverifikasi konfigurasi Apache..."
if apache2ctl configtest 2>&1 | grep -q "Syntax OK"; then
    echo -e "${GREEN}[OK]${NC} Konfigurasi Apache valid (Syntax OK)"
else
    echo -e "${RED}[ERROR]${NC} Konfigurasi Apache bermasalah:"
    apache2ctl configtest
    exit 1
fi

# =============================================================================
# 7. Restart Apache
# =============================================================================
echo -e "${YELLOW}[6/7]${NC} Merestart Apache2..."
systemctl restart apache2
echo -e "${GREEN}[OK]${NC} Apache2 berhasil direstart"

# =============================================================================
# 8. Verifikasi akhir
# =============================================================================
echo -e "${YELLOW}[7/7]${NC} Verifikasi akhir..."
echo ""
echo -e "${YELLOW}  Modul Apache yang aktif:${NC}"
apache2ctl -M 2>/dev/null | grep -E "proxy_fcgi|php" | sed 's/^/    - /'

echo ""
echo -e "${YELLOW}  Status PHP-FPM:${NC}"
systemctl status php${PHP_VERSION}-fpm --no-pager | grep -E "Active:|Status:" | sed 's/^/    /'

echo ""
echo -e "${YELLOW}  Tes koneksi HTTP (localhost):${NC}"
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost/)
if [ "$HTTP_STATUS" = "200" ]; then
    echo -e "    HTTP Status: ${GREEN}${HTTP_STATUS} OK${NC}"
else
    echo -e "    HTTP Status: ${RED}${HTTP_STATUS}${NC}"
fi

echo ""
echo -e "${GREEN}=================================================${NC}"
echo -e "${GREEN}  MIGRASI SELESAI!${NC}"
echo -e "${GREEN}=================================================${NC}"
echo ""
echo "Apache2 sekarang menggunakan PHP-FPM melalui FastCGI."
echo "  Socket: ${FPM_SOCK}"
echo ""
echo "Jika ada masalah, Anda bisa kembali ke mod_php dengan menjalankan:"
echo "  sudo a2enmod php${PHP_VERSION}"
echo "  sudo a2dismod proxy_fcgi"
echo "  sudo a2disconf php${PHP_VERSION}-fpm"
echo "  sudo systemctl restart apache2"
echo ""
