#!/usr/bin/env bash
# phpMyAdmin en XAMPP (Linux): usa TCP 127.0.0.1:3306 en lugar del socket Unix.
# Motivo: el socket está bajo /opt/lampp/var/mysql/ con permisos que Apache no puede
# atravesar → mysqli 2002 "Permission denied" aunque MySQL esté corriendo.
# Opcional: fija mysqli/pdo_mysql default_socket en php.ini (apps que usen localhost).
# Uso: sudo bash /ruta/al/repo/scripts/fix-phpmyadmin-xampp-config.sh
set -euo pipefail

CONFIG="${CONFIG:-/opt/lampp/phpmyadmin/config.inc.php}"
PHPINI="${PHPINI:-/opt/lampp/etc/php.ini}"
XAMPP="${XAMPP:-/opt/lampp}"

if [[ $EUID -ne 0 ]]; then
  echo "Ejecutá como root: sudo $0"
  exit 1
fi

if [[ ! -f "$CONFIG" ]]; then
  echo "No existe $CONFIG"
  exit 1
fi

BACKUP="${CONFIG}.bak.$(date +%Y%m%d_%H%M%S)"
cp -a "$CONFIG" "$BACKUP"
echo "Backup config.inc.php: $BACKUP"

python3 - "$CONFIG" <<'PY'
import re
import sys
from pathlib import Path

path = Path(sys.argv[1])
text_orig = path.read_text(encoding="utf-8", errors="replace")
text = text_orig

OLD_COMMENTED = "//$cfg['Servers'][$i]['host'] = 'localhost';"
NEW_TCP = """$cfg['Servers'][$i]['host'] = '127.0.0.1';
$cfg['Servers'][$i]['port'] = '3306';"""


def ensure_tcp_mysql(s: str) -> str:
    # Quitar socket Unix (provoca EACCES si el directorio del datadir no es atravesable por Apache)
    s = re.sub(
        r"^\s*\$cfg\['Servers'\]\[\$i\]\['socket'\]\s*=\s*[^;]+;\s*\n",
        "",
        s,
        flags=re.MULTILINE,
    )
    s = s.replace(
        "$cfg['Servers'][$i]['host'] = 'localhost';",
        "$cfg['Servers'][$i]['host'] = '127.0.0.1';",
    )
    if "$cfg['Servers'][$i]['port']" not in s:
        s = s.replace(
            "$cfg['Servers'][$i]['host'] = '127.0.0.1';",
            "$cfg['Servers'][$i]['host'] = '127.0.0.1';\n$cfg['Servers'][$i]['port'] = '3306';",
            1,
        )
    return s


def comment_pma_lines(s: str) -> str:
    lines = s.splitlines(keepends=True)
    out = []
    for line in lines:
        stripped = line.lstrip()
        if not stripped.startswith("$cfg['Servers'][$i]['"):
            out.append(line)
            continue
        if stripped.startswith("//"):
            out.append(line)
            continue
        if any(
            stripped.startswith(prefix)
            for prefix in (
                "$cfg['Servers'][$i]['controluser']",
                "$cfg['Servers'][$i]['controlpass']",
                "$cfg['Servers'][$i]['pmadb']",
            )
        ):
            out.append("// " + line.lstrip("// "))
            continue
        if "pma__" in line:
            out.append("// " + line.lstrip("// "))
            continue
        out.append(line)
    return "".join(out)


if OLD_COMMENTED in text:
    text = text.replace(OLD_COMMENTED, NEW_TCP, 1)
    print("phpMyAdmin: host + puerto TCP (instalación típica comentada).")
else:
    text = ensure_tcp_mysql(text)
    if text != text_orig:
        print("phpMyAdmin: conexión por TCP 127.0.0.1:3306 (socket eliminado si existía).")
    else:
        print("phpMyAdmin: bloque servidor ya coherente o sin cambios detectados.")

text = comment_pma_lines(text)
text_final = ensure_tcp_mysql(text)

if text_final != text_orig:
    path.write_text(text_final, encoding="utf-8")
    print("phpMyAdmin: guardado.")
else:
    print("phpMyAdmin: sin cambios en disco.")
PY

if [[ -f "$PHPINI" ]]; then
  BAK_INI="${PHPINI}.bak.$(date +%Y%m%d_%H%M%S)"
  cp -a "$PHPINI" "$BAK_INI"
  echo "Backup php.ini: $BAK_INI"
  python3 - "$PHPINI" <<'PY'
import re
import sys
from pathlib import Path

sock = "/opt/lampp/var/mysql/mysql.sock"
path = Path(sys.argv[1])
text = path.read_text(encoding="utf-8", errors="replace")
orig = text

for key in ("mysqli.default_socket", "pdo_mysql.default_socket"):
    if f"{key}={sock}" in text:
        continue
    pat = rf"^({re.escape(key)})\s*=\s*.*$"
    def repl(m):
        return f"{m.group(1)}={sock}"
    text_new, n = re.subn(pat, repl, text, count=1, flags=re.MULTILINE)
    if n:
        text = text_new
        print(f"php.ini: fijado {key}")
    elif sock not in text:
        print(f"php.ini: ADVERTENCIA — no encontré la línea {key} para reemplazar.")

if text != orig:
    path.write_text(text, encoding="utf-8")
else:
    print("php.ini: sin cambios (socket ya correcto o líneas no encontradas).")
PY
else
  echo "No existe $PHPINI — se omitió el parche de php.ini."
fi

if [[ -x "$XAMPP/lampp" ]]; then
  echo "Reiniciando Apache..."
  "$XAMPP/lampp" restartapache
fi

echo ""
echo "Abrí: http://localhost/phpmyadmin/"
echo "Usuario: root | Contraseña: (vacía) salvo que la hayas cambiado."
echo "Restaurar: sudo cp \"$BACKUP\" \"$CONFIG\""
