#!/bin/bash
# alpha-dbengine — install / enable / disable database engines from the panel.
# Root-owned; called by www-data via NOPASSWD sudoers. STRICT safety:
#   - never installs an engine that would clobber the live MariaDB (mysql/percona
#     share mysqld files + :3306);
#   - never stops MariaDB (it runs the panel);
#   - heavy background installs run detached, logged to /var/log/alpha-dbengine.log.
#     install <engine>   apt/binary install a non-conflicting engine
#     enable  <engine>   systemctl enable --now <service>
#     disable <engine>   systemctl disable --now <service>  (not mariadb)
set -eu
ACTION="${1:-}"; ENGINE="${2:-}"
LOG=/var/log/alpha-dbengine.log
[[ "$ENGINE" =~ ^[a-z]+$ ]] || { echo "BAD_ENGINE: $ENGINE"; exit 2; }

svc_of() { case "$1" in postgres) echo postgresql;; cockroach) echo cockroach;; mariadb) echo mariadb;; *) echo "";; esac; }

case "$ACTION" in
  enable|disable)
    SVC=$(svc_of "$ENGINE")
    [ -n "$SVC" ] || { echo "NO_SERVICE: $ENGINE has no manageable service"; exit 3; }
    [ "$ENGINE" = mariadb ] && [ "$ACTION" = disable ] && { echo "PROTECTED: MariaDB runs the panel"; exit 4; }
    systemctl list-unit-files "${SVC}.service" 2>/dev/null | grep -q "$SVC" || { echo "NOT_INSTALLED: $ENGINE"; exit 5; }
    if [ "$ACTION" = enable ]; then systemctl enable --now "$SVC" >/dev/null 2>&1 && echo "OK: $ENGINE enabled + started"
    else systemctl disable --now "$SVC" >/dev/null 2>&1 && echo "OK: $ENGINE disabled + stopped"; fi
    ;;
  install)
    case "$ENGINE" in
      mysql|percona)
        echo "CONFLICT: $ENGINE shares mysqld files and :3306 with the live MariaDB — refusing to install"; exit 6 ;;
      mariadb)
        echo "CONFLICT: MariaDB is already installed (the panel database)"; exit 6 ;;
      tidb)
        echo "MANUAL: TiDB is a multi-node cluster — install with TiUP (see docs), not a single apt package"; exit 7 ;;
      sqlite)
        [ -x /usr/bin/sqlite3 ] && { echo "OK: SQLite already available"; exit 0; }
        setsid bash -c "{ echo \"== \$(date -Is) install sqlite3\"; DEBIAN_FRONTEND=noninteractive apt-get install -y -q sqlite3 php-sqlite3; echo done rc=\$?; } >> $LOG 2>&1" </dev/null &
        echo "STARTED: installing SQLite (sqlite3 + php-sqlite3)" ;;
      postgres)
        [ -d /etc/postgresql ] && { echo "OK: PostgreSQL already installed"; exit 0; }
        setsid bash -c "{ echo \"== \$(date -Is) install postgresql\"; DEBIAN_FRONTEND=noninteractive apt-get install -y -q postgresql postgresql-contrib; systemctl enable --now postgresql; echo done rc=\$?; } >> $LOG 2>&1" </dev/null &
        echo "STARTED: installing PostgreSQL (background, ~1 min)" ;;
      cockroach)
        [ -x /usr/local/bin/cockroach ] && { echo "OK: CockroachDB already installed"; exit 0; }
        # single-node CockroachDB: download the static binary + a systemd unit (insecure, localhost only)
        setsid bash -c "{
          echo \"== \$(date -Is) install cockroachdb\"
          cd /tmp
          V=v24.2.4
          curl -fsSL \"https://binaries.cockroachdb.com/cockroach-\${V}.linux-amd64.tgz\" -o crdb.tgz && \
          tar xzf crdb.tgz && install -m755 \"cockroach-\${V}.linux-amd64/cockroach\" /usr/local/bin/cockroach && \
          mkdir -p /var/lib/cockroach && \
          printf '%s\n' '[Unit]' 'Description=CockroachDB single-node' 'After=network.target' \
            '[Service]' 'Type=notify' 'User=root' 'ExecStart=/usr/local/bin/cockroach start-single-node --insecure --listen-addr=127.0.0.1:26257 --http-addr=127.0.0.1:8085 --store=/var/lib/cockroach' 'Restart=on-failure' \
            '[Install]' 'WantedBy=multi-user.target' > /etc/systemd/system/cockroach.service && \
          systemctl daemon-reload && systemctl enable --now cockroach
          echo done rc=\$?
        } >> $LOG 2>&1" </dev/null &
        echo "STARTED: installing CockroachDB single-node (background; binary download ~1-2 min)" ;;
      *) echo "UNKNOWN_ENGINE: $ENGINE"; exit 1 ;;
    esac ;;
  remove)
    case "$ENGINE" in
      mariadb) echo "PROTECTED: MariaDB runs the panel — cannot be removed here"; exit 4 ;;
      postgres)
        [ -d /etc/postgresql ] || { echo "NOT_INSTALLED: PostgreSQL"; exit 5; }
        setsid bash -c "{ echo \"== \$(date -Is) remove postgresql\"; systemctl disable --now postgresql 2>/dev/null; DEBIAN_FRONTEND=noninteractive apt-get purge -y -q 'postgresql*'; DEBIAN_FRONTEND=noninteractive apt-get autoremove -y -q; echo done rc=\$?; } >> $LOG 2>&1" </dev/null &
        echo "STARTED: removing PostgreSQL (background — this also drops its databases)" ;;
      sqlite)
        [ -x /usr/bin/sqlite3 ] || { echo "NOT_INSTALLED: SQLite CLI"; exit 5; }
        setsid bash -c "{ echo \"== \$(date -Is) remove sqlite3\"; DEBIAN_FRONTEND=noninteractive apt-get purge -y -q sqlite3; echo done rc=\$?; } >> $LOG 2>&1" </dev/null &
        echo "STARTED: removing the SQLite CLI (php-sqlite3 kept for apps)" ;;
      cockroach)
        [ -x /usr/local/bin/cockroach ] || { echo "NOT_INSTALLED: CockroachDB"; exit 5; }
        systemctl disable --now cockroach 2>/dev/null || true
        rm -f /usr/local/bin/cockroach /etc/systemd/system/cockroach.service
        systemctl daemon-reload 2>/dev/null || true
        rm -rf /var/lib/cockroach
        echo "OK: CockroachDB removed (binary, service, and its data store)" ;;
      mysql|percona) echo "NOT_INSTALLED: $ENGINE"; exit 5 ;;
      *) echo "UNKNOWN_ENGINE: $ENGINE"; exit 1 ;;
    esac ;;
  *) echo "BAD_ACTION: $ACTION"; exit 1 ;;
esac
