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

if [ "$#" -lt 1 ]; then
  echo "Usage: $0 /path/to/studio/public"
  echo "Example: $0 /home/itahukamedia/public_html/studio.itahukamedia.com/public"
  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

if ! command -v php >/dev/null 2>&1; then
  echo "ERROR: php CLI not found in PATH." >&2
  echo "This patch uses php CLI only, not python." >&2
  exit 1
fi

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"

php <<'PHP' "$JOIN_FILE" "$COPRODUCER_FILE" "$INLINE_JS"
<?php
$joinPath = $argv[1];
$copPath  = $argv[2];
$jsPath   = $argv[3];

function fail($msg) {
    fwrite(STDERR, $msg . PHP_EOL);
    exit(1);
}
function writeFile($path, $content) {
    if (file_put_contents($path, $content) === false) {
        fail("Failed writing: $path");
    }
}
function replaceOnceOrFail($content, $search, $replace, $label) {
    if (strpos($content, $replace) !== false) {
        return $content; // already patched
    }
    $count = substr_count($content, $search);
    if ($count !== 1) {
        fail("Patch failed for $label: expected 1 exact match, got $count");
    }
    return str_replace($search, $replace, $content);
}

/* ---------- join.php ---------- */
$join = file_get_contents($joinPath);
if ($join === false) fail("Cannot read $joinPath");

$joinSearch = <<<'TXT'
$roomName = $project['livekit_room'] ?? ($project['room_name'] ?? $projectId);
$roomName = is_string($roomName) ? trim($roomName) : $projectId;
TXT;

$joinReplace = <<<'TXT'
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);
TXT;

$join = replaceOnceOrFail($join, $joinSearch, $joinReplace, 'join.php room resolver');
writeFile($joinPath, $join);

/* ---------- coproducer.php ---------- */
$cop = file_get_contents($copPath);
if ($cop === false) fail("Cannot read $copPath");

$copSearch = <<<'TXT'
// Room mapping: connect LiveKit using per-project room_name (fallbacks: livekit_room, project_id).
$roomName = $p['room_name'] ?? ($p['livekit_room'] ?? ($p['project_id'] ?? 'demo'));
$roomName = is_string($roomName) ? trim($roomName) : 'demo';
if ($roomName === '') $roomName = 'demo';
TXT;

$copReplace = <<<'TXT'
// 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);
TXT;

$cop = replaceOnceOrFail($cop, $copSearch, $copReplace, 'coproducer.php room resolver');

$bootSearch = <<<'TXT'
'roomName'       => ($roomName ?? ($p['room_name'] ?? '')),
TXT;

$bootReplace = <<<'TXT'
'roomName'       => ($roomName ?? ($p['room_name'] ?? '')),
'roomDefault'    => ($roomName ?? ($p['room_name'] ?? '')),
TXT;

$cop = replaceOnceOrFail($cop, $bootSearch, $bootReplace, 'coproducer.php boot roomDefault');
writeFile($copPath, $cop);

/* ---------- coproducer.inline-main.js ---------- */
$js = file_get_contents($jsPath);
if ($js === false) fail("Cannot read $jsPath");

$jsSearch = <<<'TXT'
const ROOM_DEFAULT = (window.COPRODUCER_BOOT && window.COPRODUCER_BOOT.roomDefault) || "demo";
TXT;

$jsReplace = <<<'TXT'
const ROOM_DEFAULT = (window.COPRODUCER_BOOT && (window.COPRODUCER_BOOT.roomDefault || window.COPRODUCER_BOOT.roomName)) || "demo";
TXT;

$js = replaceOnceOrFail($js, $jsSearch, $jsReplace, 'coproducer.inline-main.js room default');
writeFile($jsPath, $js);

echo "Patched:\n";
echo " - $joinPath\n";
echo " - $copPath\n";
echo " - $jsPath\n";
PHP

echo "Patch complete."
echo
echo "Run syntax checks:"
echo "php -l \"$JOIN_FILE\""
echo "php -l \"$COPRODUCER_FILE\""
echo
echo "Then hard-refresh browser and retest guest join -> auto appearance in coproducer."
