#!/bin/bash

# Usage check
if [ -z "$1" ]; then
  echo "Użycie: $0 {start|stop|restart|status|...} [-n|--dry-run]"
  exit 1
fi

ACTION="$1"
# opcjonalny drugi argument: dry-run
DRY_RUN=0
if [ "$2" = "-n" ] || [ "$2" = "--dry-run" ]; then
  DRY_RUN=1
fi

OS="$(uname)"

if [ "$OS" = "Darwin" ]; then
  # macOS: zachowaj dotychczasowe zachowanie
  if [ "$DRY_RUN" -eq 1 ]; then
    echo "DRY RUN: brew services $ACTION php"
    echo "DRY RUN: brew services $ACTION mysql"
    echo "DRY RUN: brew services $ACTION nginx"
    exit 0
  fi

  brew services "$ACTION" php
  brew services "$ACTION" mysql
  brew services "$ACTION" nginx
  exit $?
fi

# Dla pozostałych unixowych systemów (Linux)
# Funkcja pomocnicza: próbuje znaleźć i wykonać akcję systemctl dla listy kandydatów
try_systemctl_candidates() {
  local action="$1"
  local candidates=(php-fpm php8.0-fpm php8.1-fpm php8.2-fpm php8.3-fpm php8.4-fpm php)
  local name

  if ! command -v systemctl >/dev/null 2>&1; then
    return 1
  fi

  for name in "${candidates[@]}"; do
    if systemctl list-unit-files "${name}.service" >/dev/null 2>&1 || systemctl status "${name}.service" >/dev/null 2>&1; then
      echo "Running: systemctl $action $name"
      if [ "$DRY_RUN" -eq 1 ]; then
        echo "DRY RUN: systemctl $action $name"
      else
        systemctl "$action" "$name"
      fi
      return 0
    fi
  done

  return 1
}

# Funkcja fallback: próbuj użyć 'service' dla podanych nazw
try_service_cmd() {
  local action="$1"
  local candidates=(php-fpm php mysql nginx)
  local name

  if ! command -v service >/dev/null 2>&1; then
    return 1
  fi

  for name in "${candidates[@]}"; do
    # próbujemy wykonać polecenie; service zwykle zwraca kod wyjścia
    if [ "$DRY_RUN" -eq 1 ]; then
      echo "DRY RUN: service $name $action"
      return 0
    else
      if service "$name" "$action" >/dev/null 2>&1; then
        echo "service $name $action"
        service "$name" "$action"
        return 0
      fi
    fi
  done

  return 1
}

# PHP
if try_systemctl_candidates "$ACTION"; then
  : # success
else
  echo "Nie znaleziono jednostki PHP dla systemctl lub systemctl nie jest dostępny; próbuję 'service'..."
  try_service_cmd "$ACTION" || echo "Nie udało się uruchomić/zatrzymać usługi PHP (spróbuj ręcznie dopasować nazwę usługi)."
fi

# MySQL
if command -v systemctl >/dev/null 2>&1; then
  for db in mysql mysqld; do
    if systemctl list-unit-files "${db}.service" >/dev/null 2>&1 || systemctl status "${db}.service" >/dev/null 2>&1; then
      echo "Running: systemctl $ACTION $db"
      if [ "$DRY_RUN" -eq 1 ]; then
        echo "DRY RUN: systemctl $ACTION $db"
      else
        systemctl "$ACTION" "$db"
      fi
      break
    fi
  done
else
  if [ "$DRY_RUN" -eq 1 ]; then
    echo "DRY RUN: service mysql $ACTION"
  else
    service mysql "$ACTION" >/dev/null 2>&1 || echo "Nie można kontrolować MySQL (brak systemctl/service lub nieznana nazwa usługi)."
  fi
fi

# Nginx
if command -v systemctl >/dev/null 2>&1; then
  if systemctl list-unit-files nginx.service >/dev/null 2>&1 || systemctl status nginx.service >/dev/null 2>&1; then
    echo "Running: systemctl $ACTION nginx"
    if [ "$DRY_RUN" -eq 1 ]; then
      echo "DRY RUN: systemctl $ACTION nginx"
    else
      systemctl "$ACTION" nginx
    fi
  else
    echo "nginx.service nieznany dla systemctl; próbuję 'service'..."
    if [ "$DRY_RUN" -eq 1 ]; then
      echo "DRY RUN: service nginx $ACTION"
    else
      service nginx "$ACTION" >/dev/null 2>&1 || echo "Nie można kontrolować nginx (brak systemctl/service lub nieznana nazwa usługi)."
    fi
  fi
else
  if [ "$DRY_RUN" -eq 1 ]; then
    echo "DRY RUN: service nginx $ACTION"
  else
    service nginx "$ACTION" >/dev/null 2>&1 || echo "Nie można kontrolować nginx (brak systemctl/service lub nieznana nazwa usługi)."
  fi
fi

exit 0
