#!/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"

if [ ! -f "$JOIN_FILE" ]; then
  echo "Missing required file: $JOIN_FILE" >&2
  exit 1
fi

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

STAMP="$(date +%Y%m%d_%H%M%S)"
cp -a "$JOIN_FILE" "$JOIN_FILE.bak.$STAMP"
echo "Backup created: $JOIN_FILE.bak.$STAMP"

php <<'PHP' "$JOIN_FILE"
<?php
$joinPath = $argv[1];

function fail($msg) {
    fwrite(STDERR, $msg . PHP_EOL);
    exit(1);
}
function readFileStrict($path) {
    $c = file_get_contents($path);
    if ($c === false) fail("Cannot read $path");
    return $c;
}
function writeFileStrict($path, $content) {
    if (file_put_contents($path, $content) === false) fail("Cannot write $path");
}
function replaceOnceOrKeep($content, $search, $replace, $label) {
    if (strpos($content, $replace) !== false) return $content;
    $count = substr_count($content, $search);
    if ($count === 1) return str_replace($search, $replace, $content);
    if ($count === 0) {
        fwrite(STDERR, "WARN: $label not matched; skipped\n");
        return $content;
    }
    fail("Patch failed for $label: expected 1 match, got $count");
}

$join = readFileStrict($joinPath);

/* 1) Use normalized project room resolver on PHP side */
$search1 = <<<'TXT'
$roomName = $project['livekit_room'] ?? ($project['room_name'] ?? $projectId);
$roomName = is_string($roomName) ? trim($roomName) : $projectId;
TXT;

$replace1 = <<<'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 = replaceOnceOrKeep($join, $search1, $replace1, 'PHP room resolver');

/* 2) Never generate share/join URLs with fallback camA as room */
$search2 = <<<'TXT'
    base.searchParams.set("room", ((els.room && els.room.value.trim()) || "camA"));
TXT;

$replace2 = <<<'TXT'
    base.searchParams.set("room", ((window.JOIN_DEFAULTS && window.JOIN_DEFAULTS.roomName) || (els.room && els.room.value.trim()) || "demo"));
TXT;

$join = replaceOnceOrKeep($join, $search2, $replace2, 'share URL room fallback');

/* 3) Never let querystring force room=camA; default to resolved project room */
$search3 = <<<'TXT'
    if (els.room) els.room.value = qsGet("room", "camA");
TXT;

$replace3 = <<<'TXT'
    if (els.room) els.room.value = qsGet("room", (defaults.roomName || "demo"));
TXT;

$join = replaceOnceOrKeep($join, $search3, $replace3, 'room input default');

/* 4) Lock visible room field to resolved project room so user/camera cannot override LK room */
$search4 = <<<'TXT'
    setVal('room', defaults.roomName);
TXT;

$replace4 = <<<'TXT'
    setVal('room', defaults.roomName);
    if (els.room) {
      els.room.value = defaults.roomName || "demo";
      els.room.readOnly = true;
      els.room.setAttribute('readonly', 'readonly');
      els.room.title = 'LiveKit room is locked to this project';
    }
TXT;

$join = replaceOnceOrKeep($join, $search4, $replace4, 'lock room field');

/* 5) Expose a stable defaults object for JS */
$search5 = <<<'TXT'
  window.JOIN_DEFAULTS = {
    projectId: <?php echo json_encode($projectId); ?>,
    tokenEndpoint: <?php echo json_encode($tokenEndpoint); ?>,
    roomName: <?php echo json_encode($roomName); ?>,
TXT;

$replace5 = <<<'TXT'
  window.JOIN_DEFAULTS = {
    projectId: <?php echo json_encode($projectId); ?>,
    tokenEndpoint: <?php echo json_encode($tokenEndpoint); ?>,
    roomName: <?php echo json_encode($roomName); ?>,
    roomDefault: <?php echo json_encode($roomName); ?>,
TXT;

$join = replaceOnceOrKeep($join, $search5, $replace5, 'JOIN_DEFAULTS roomDefault');

/* 6) Prefer studio-return as return/program feed on guest page */
$search6 = <<<'TXT'
  function pickRemoteVideoParticipant(){
    if (!lkRoom) return null;
    const remotes = Array.from(lkRoom.remoteParticipants.values());
    for (const p of remotes){
      for (const pub of p.videoTrackPublications.values()){
        if (pub.track) return p;
      }
    }
    for (const p of remotes){
      if (p.videoTrackPublications.size > 0) return p;
    }
    return remotes[0] || null;
  }
TXT;

$replace6 = <<<'TXT'
  function pickRemoteVideoParticipant(){
    if (!lkRoom) return null;
    const remotes = Array.from(lkRoom.remoteParticipants.values());

    const preferred = remotes.find(p => String((p && p.identity) || '').trim() === 'studio-return');
    if (preferred){
      for (const pub of preferred.videoTrackPublications.values()){
        if (pub.track) return preferred;
      }
      if (preferred.videoTrackPublications.size > 0) return preferred;
    }

    for (const p of remotes){
      for (const pub of p.videoTrackPublications.values()){
        if (pub.track) return p;
      }
    }
    for (const p of remotes){
      if (p.videoTrackPublications.size > 0) return p;
    }
    return remotes[0] || null;
  }
TXT;

$join = replaceOnceOrKeep($join, $search6, $replace6, 'prefer studio-return');

writeFileStrict($joinPath, $join);
echo "Patched: $joinPath\n";
PHP

echo
echo "Patch complete."
echo "Run syntax check:"
echo "php -l \"$JOIN_FILE\""
echo
echo "Then hard refresh the guest page and test again."
echo "Important: remove any old room=camA from the URL when testing."