#!/bin/bash

INPUT_FILE="./input.json"

pm() {
  env=$(jq -r '.env' "$INPUT_FILE")
  constant_traffic=$(jq -r '.constant_traffic // false' "$INPUT_FILE")
  if [[ "$env" == "dev" ]]; then
    echo '      pm: "ondemand"'
  elif [[ "$env" == "prod" ]]; then
    [[ "$constant_traffic" == "true" ]] && echo '      pm: "static"' || echo '      pm: "dynamic"'
  else
    echo "possible values for 'env': dev, prod"
    echo "possible values for 'constant_traffic': true, false"
  fi
}

pm_max_children() {
  maximum_active_process_across_pods_max=$(jq -r '.maximum_active_process_across_pods_max' "$INPUT_FILE")
  process_memory_usage_max=$(jq -r '.process_memory_usage_max' "$INPUT_FILE")
  if ! [[ "$maximum_active_process_across_pods_max" =~ ^[1-9][0-9]*$ ]] || ! [[ "$process_memory_usage_max" =~ ^[1-9][0-9]*$ ]]; then
    echo "possible values for 'maximum_active_process_across_pods_max': positive integer (e.g. 40, 50, 100)"
    echo "possible values for 'process_memory_usage_max': average memory per PHP process in MB (e.g. 32, 64, 128)"
    return
  fi
  estimated_total_memory=$(( process_memory_usage_max * maximum_active_process_across_pods_max ))
  estimated_total_with_overhead=$(awk "BEGIN { printf \"%.0f\", $estimated_total_memory * 1.2 }")
  max_children=$(awk "BEGIN { printf \"%.0f\", $estimated_total_with_overhead / $process_memory_usage_max }")
  echo "      pm.max_children: $max_children"
}

pm_max_requests() {
  served_request_count_mean=$(jq -r '.served_request_count_mean // 0' "$INPUT_FILE")
  if ! [[ "$served_request_count_mean" =~ ^[0-9]+$ ]]; then
    echo "      pm.max_requests: 0"
    echo "possible values for 'served_request_count_mean': positive integer (e.g. 5, 150, 250)"
    return
  fi
  if (( served_request_count_mean < 10 )); then
    echo "      pm.max_requests: 200"
  elif (( served_request_count_mean < 200 )); then
    echo "      pm.max_requests: 500"
  else
    echo "      pm.max_requests: 1000"
  fi
}

pm_dynamic_extra_settings() {
  pm_mode=$(pm | awk -F\" '{print $2}')
  if [[ "$pm_mode" != "dynamic" ]]; then
    return
  fi
  max_children=$(pm_max_children | awk '{print $2}')
  if ! [[ "$max_children" =~ ^[1-9][0-9]*$ ]]; then
    return
  fi
  start_servers=$(awk "BEGIN { printf \"%.0f\", $max_children * 0.2 }")
  min_spare_servers=$start_servers
  proposed_max_spare_servers=$((start_servers + 10))
  max_spare_servers=$(( proposed_max_spare_servers < max_children ? proposed_max_spare_servers : max_children ))
  echo "      pm.start_servers: $start_servers"
  echo "      pm.min_spare_servers: $min_spare_servers"
  echo "      pm.max_spare_servers: $max_spare_servers"
}

pm
pm_max_children
pm_max_requests
pm_dynamic_extra_settings

{
  "env": "prod",
  "constant_traffic": "false",
  "maximum_active_process_across_pods_max": 123,
  "process_memory_usage_max": 6,
  "served_request_count_mean": 2590
}