#!/usr/bin/env bash

# Script to configure Nginx and PHP to allow uploads up to 9MB.
# Tested on typical Debian/Ubuntu setups with Nginx + PHP-FPM.

set -euo pipefail

UPLOAD_LIMIT="9M"

echo "Configuring upload limits to ${UPLOAD_LIMIT} for Nginx and PHP..."

###############################################################################
# Helper functions
###############################################################################

backup_file() {
  local file="$1"

  if [[ -f "$file" ]]; then
    local ts
    ts="$(date +%Y%m%d-%H%M%S)"
    local backup="${file}.bak-${ts}"
    cp "$file" "$backup"
    echo "  - Backup created: ${backup}"
  fi
}

ensure_root() {
  if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then
    echo "This script must be run as root (use sudo)." >&2
    exit 1
  fi
}

update_or_add_ini_value() {
  local ini_file="$1"
  local key="$2"
  local value="$3"

  if grep -qE "^[;[:space:]]*${key}[[:space:]]*=" "$ini_file"; then
    sed -i "s|^[;[:space:]]*${key}[[:space:]]*=.*|${key} = ${value}|g" "$ini_file"
  else
    echo "" >> "$ini_file"
    echo "${key} = ${value}" >> "$ini_file"
  fi
}

###############################################################################
# Nginx configuration
###############################################################################

configure_nginx() {
  local nginx_conf="/etc/nginx/nginx.conf"

  if ! command -v nginx >/dev/null 2>&1; then
    echo "Nginx not found, skipping Nginx configuration."
    return 0
  fi

  if [[ ! -f "$nginx_conf" ]]; then
    echo "Nginx config file not found at ${nginx_conf}, skipping Nginx configuration."
    return 0
  fi

  echo "Updating Nginx client_max_body_size in ${nginx_conf}..."
  backup_file "$nginx_conf"

  if grep -q "client_max_body_size" "$nginx_conf"; then
    sed -i "s/client_max_body_size[^;]*;/client_max_body_size ${UPLOAD_LIMIT};/g" "$nginx_conf"
  else
    # Insert inside the http { ... } block
    sed -i "/http\s*{/a \    client_max_body_size ${UPLOAD_LIMIT};" "$nginx_conf"
  fi

  echo "Reloading Nginx..."
  if systemctl is-active --quiet nginx; then
    systemctl reload nginx
  else
    echo "Nginx service not active; please reload/restart Nginx manually if needed."
  fi
}

###############################################################################
# PHP configuration
###############################################################################

configure_php() {
  if ! command -v php >/dev/null 2>&1; then
    echo "PHP not found, skipping PHP configuration."
    return 0
  fi

  local php_ini
  php_ini="$(php -r 'echo php_ini_loaded_file();' 2>/dev/null || true)"

  if [[ -z "$php_ini" || ! -f "$php_ini" ]]; then
    echo "Could not determine php.ini path automatically."
    echo "Please edit your php.ini manually to set:"
    echo "  upload_max_filesize = ${UPLOAD_LIMIT}"
    echo "  post_max_size       = ${UPLOAD_LIMIT}"
    return 0
  fi

  echo "Updating PHP limits in ${php_ini}..."
  backup_file "$php_ini"

  update_or_add_ini_value "$php_ini" "upload_max_filesize" "$UPLOAD_LIMIT"
  update_or_add_ini_value "$php_ini" "post_max_size" "$UPLOAD_LIMIT"

  # Try to restart PHP-FPM (common service names)
  for svc in php-fpm php7.4-fpm php8.0-fpm php8.1-fpm php8.2-fpm; do
    if systemctl list-units --type=service --all | grep -q "$svc"; then
      echo "Restarting ${svc}..."
      systemctl restart "$svc" || echo "  Warning: failed to restart ${svc}, restart it manually."
      return 0
    fi
  done

  echo "No PHP-FPM service found via systemctl; if you use a different PHP setup, restart it manually."
}

###############################################################################
# Main
###############################################################################

ensure_root
configure_nginx
configure_php

echo "Done. Nginx and PHP are now configured for ~${UPLOAD_LIMIT} uploads (where applicable)."
