#!/usr/bin/env bash
set -euo pipefail

if [[ $# -lt 1 ]]; then
  echo "Usage: $0 /path/to/project/root"
  echo "Example: $0 /home/itahukamedia/public_html/studio.itahukamedia.com"
  exit 1
fi

ROOT="$1"
JOIN_FILE="$ROOT/join.php"
COPRODUCER_FILE="$ROOT/coproducer.php"
INLINE_JS="$ROOT/assets/js/modules/coproducer.inline-main.js"

for f in "$JOIN_FILE" "$COPRODUCER_FILE" "$INLINE_JS"; do
  if [[ ! -f "$f" ]]; then
    echo "Missing required file: $f" >&2
    exit 1
  fi
done

STAMP="$(date +%Y%m%d_%H%M%S)"
cp -a "$JOIN_FILE" "$JOIN_FILE.bak.$STAMP"
cp -a "$COPRODUCER_FILE" "$COPRODUCER_FILE.bak.$STAMP"
cp -a "$INLINE_JS" "$INLINE_JS.bak.$STAMP"

echo "Backups created with suffix .bak.$STAMP"

python3 - "$JOIN_FILE" "$COPRODUCER_FILE" "$INLINE_JS" <<'PY'
import re
import sys
from pathlib import Path

join_path = Path(sys.argv[1])
cop_path = Path(sys.argv[2])
js_path = Path(sys.argv[3])


def replace_or_fail(text, pattern, repl, label, flags=re.S):
    new_text, count = re.subn(pattern, repl, text, count=1, flags=flags)
    if count != 1:
        raise SystemExit(f"Patch failed for {label}: expected 1 match, got {count}")
    return new_text

# ---------- join.php ----------
join_text = join_path.read_text(encoding="utf-8")
if "function resolve_livekit_room(array $project, string $fallback = ''): string" not in join_text:
    join_text = replace_or_fail(
        join_text,
        r"\$roomName\s*=\s*\$project\['livekit_room'\]\s*\?\?\s*\(\$project\['room_name'\]\s*\?\?\s*\$projectId\);\s*\n\$roomName\s*=\s*is_string\(\$roomName\)\s*\?\s*trim\(\$roomName\)\s*:\s*\$projectId;",
        """function resolve_livekit_room(array $project, string $fallback = ''): string {
    $candidates = [
        $project['livekit_room'] ?? null,
        $project['room_name'] ?? null,
        $project['project_id'] ?? null,
        $fallback,
    ];

    foreach ($candidates as $candidate) {
        $value = trim((string)$candidate);
        if ($value !== '') return $value;
    }

    return 'demo';
}

$roomName = resolve_livekit_room($project, $projectId);""",
        "join.php room resolver"
    )
join_path.write_text(join_text, encoding="utf-8")

# ---------- coproducer.php ----------
cop_text = cop_path.read_text(encoding="utf-8")
if "function resolve_livekit_room(array $project, string $fallback = ''): string" not in cop_text:
    cop_text = replace_or_fail(
        cop_text,
        r"// Room mapping: connect LiveKit using per-project room_name \(fallbacks: livekit_room, project_id\)\.\s*\n\$roomName\s*=\s*\$p\['room_name'\]\s*\?\?\s*\(\$p\['livekit_room'\]\s*\?\?\s*\(\$p\['project_id'\]\s*\?\?\s*'demo'\)\);\s*\n\$roomName\s*=\s*is_string\(\$roomName\)\s*\?\s*trim\(\$roomName\)\s*:\s*'demo';\s*\nif \(\$roomName === ''\) \$roomName = 'demo';",
        """// Room mapping: connect LiveKit using the same precedence as join.php.
function resolve_livekit_room(array $project, string $fallback = ''): string {
  $candidates = [
    $project['livekit_room'] ?? null,
    $project['room_name'] ?? null,
    $project['project_id'] ?? null,
    $fallback,
  ];

  foreach ($candidates as $candidate) {
    $value = trim((string)$candidate);
    if ($value !== '') return $value;
  }

  return 'demo';
}

$roomName = resolve_livekit_room($p, $pid);""",
        "coproducer.php room resolver"
    )

# Ensure boot payload exposes both roomName and roomDefault for current JS.
if "'roomDefault'    => ($roomName ?? ($p['room_name'] ?? ''))," not in cop_text:
    cop_text = replace_or_fail(
        cop_text,
        r"('roomName'\s*=>\s*\(\$roomName \?\? \(\$p\['room_name'\] \?\? ''\)\),\s*\n)",
        r"\1    'roomDefault'    => ($roomName ?? ($p['room_name'] ?? '')),\n",
        "coproducer.php boot roomDefault",
        flags=re.M
    )
cop_path.write_text(cop_text, encoding="utf-8")

# ---------- coproducer.inline-main.js ----------
js_text = js_path.read_text(encoding="utf-8")
js_old = 'const ROOM_DEFAULT = (window.COPRODUCER_BOOT && window.COPRODUCER_BOOT.roomDefault) || "demo";'
js_new = 'const ROOM_DEFAULT = (window.COPRODUCER_BOOT && (window.COPRODUCER_BOOT.roomDefault || window.COPRODUCER_BOOT.roomName)) || "demo";'
if js_old in js_text and js_new not in js_text:
    js_text = js_text.replace(js_old, js_new, 1)
js_path.write_text(js_text, encoding="utf-8")

print("Patched:")
print(f" - {join_path}")
print(f" - {cop_path}")
print(f" - {js_path}")
PY

echo "Patch complete."
echo "Recommended next step: hard refresh browser and retest guest join -> coproducer auto-appearance."
