#!/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="$ROOT/join.php"

if [ ! -f "$JOIN" ]; then
  echo "Missing file: $JOIN" >&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" "$JOIN.bak.$STAMP"
echo "Backup created: $JOIN.bak.$STAMP"

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

function fail($msg){ fwrite(STDERR, $msg . PHP_EOL); exit(1); }
function read_strict($p){ $c = file_get_contents($p); if ($c === false) fail("Cannot read: $p"); return $c; }
function write_strict($p, $c){ if (file_put_contents($p, $c) === false) fail("Cannot write: $p"); }
function patch_once(&$text, $search, $replace, $label){
  if (strpos($text, $replace) !== false) {
    echo "Already patched: $label\n";
    return;
  }
  $count = substr_count($text, $search);
  if ($count !== 1) fail("Patch failed for $label: expected 1 exact match, got $count");
  $text = str_replace($search, $replace, $text);
  echo "Patched: $label\n";
}

$join = read_strict($joinPath);

/* 1) Add optimistic join AV state flags near localHandUp / remoteVideoTrack area */
patch_once(
  $join,
  <<<'TXT'
  let remoteVideoTrack = null;
TXT,
  <<<'TXT'
  let remoteVideoTrack = null;

  // UI intent flags so MIC/CAM buttons turn ON immediately when joining with AV
  let joiningWithMic = false;
  let joiningWithCam = false;
TXT,
  'add joiningWithMic/joiningWithCam flags'
);

/* 2) Make syncButtons reflect join-intent while tracks are being created */
patch_once(
  $join,
  <<<'TXT'
  function syncButtons(){
    if (els.btnJoin) els.btnJoin.disabled = joined;
    if (els.btnLeave) els.btnLeave.disabled = !joined;

    // Allow MIC/CAM toggles after join even if tracks not created yet.
    if (els.btnMute) els.btnMute.disabled = !joined;
    if (els.btnCam)  els.btnCam.disabled  = !joined;

    const micOn = micIsOn();
    const camOn = camIsOn();
TXT,
  <<<'TXT'
  function syncButtons(){
    if (els.btnJoin) els.btnJoin.disabled = joined;
    if (els.btnLeave) els.btnLeave.disabled = !joined;

    // Allow MIC/CAM toggles after join even if tracks not created yet.
    if (els.btnMute) els.btnMute.disabled = !joined;
    if (els.btnCam)  els.btnCam.disabled  = !joined;

    const micOn = !!joiningWithMic || micIsOn();
    const camOn = !!joiningWithCam || camIsOn();
TXT,
  'syncButtons uses join-intent flags'
);

/* 3) Set intent flags right before prompting/connecting */
patch_once(
  $join,
  <<<'TXT'
    setStatus("Connecting…");

    lkRoom = new LK.Room({ adaptiveStream: true, dynacast: true });
TXT,
  <<<'TXT'
    setStatus("Connecting…");

    // Turn MIC/CAM buttons ON immediately when Join starts with AV intent
    joiningWithMic = true;
    joiningWithCam = true;

    lkRoom = new LK.Room({ adaptiveStream: true, dynacast: true });
    syncButtons();
TXT,
  'set join-intent flags before connect'
);

/* 4) Clear intent flags after full AV is actually created */
patch_once(
  $join,
  <<<'TXT'
      // Start with BOTH camera and microphone ON automatically
      await ensureLocalCam();
      await ensureLocalMic();

      attachLocal();
      if (localVU && localAudio) localVU.attachTrack(localAudio);

      syncButtons();
      refreshGuestStrip();
TXT,
  <<<'TXT'
      // Start with BOTH camera and microphone ON automatically
      await ensureLocalCam();
      await ensureLocalMic();

      attachLocal();
      if (localVU && localAudio) localVU.attachTrack(localAudio);

      joiningWithMic = false;
      joiningWithCam = false;
      syncButtons();
      refreshGuestStrip();
TXT,
  'clear join-intent flags after AV publish'
);

/* 5) Clear intent flags on connect failure */
patch_once(
  $join,
  <<<'TXT'
      lkRoom = null;
      joined = false;
      setStatus("Idle");
      cleanupTracks();
TXT,
  <<<'TXT'
      lkRoom = null;
      joined = false;
      joiningWithMic = false;
      joiningWithCam = false;
      setStatus("Idle");
      cleanupTracks();
TXT,
  'clear join-intent flags on connect failure'
);

/* 6) Clear intent flags on disconnect */
patch_once(
  $join,
  <<<'TXT'
      .on(LK.RoomEvent.Disconnected, () => {
        setStatus("Disconnected");
        joined = false;
        cleanupTracks();
TXT,
  <<<'TXT'
      .on(LK.RoomEvent.Disconnected, () => {
        setStatus("Disconnected");
        joined = false;
        joiningWithMic = false;
        joiningWithCam = false;
        cleanupTracks();
TXT,
  'clear join-intent flags on disconnected'
);

/* 7) Clear intent flags on leave() */
patch_once(
  $join,
  <<<'TXT'
      lkRoom = null;
      joined = false;
      localHandUp = false;
TXT,
  <<<'TXT'
      lkRoom = null;
      joined = false;
      joiningWithMic = false;
      joiningWithCam = false;
      localHandUp = false;
TXT,
  'clear join-intent flags on leave'
);

write_strict($joinPath, $join);
echo "Done: $joinPath\n";
PHP

echo
echo "Patch complete."
echo
echo "Run syntax check:"
echo "php -l \"$JOIN\""
echo
echo "Then hard-refresh join.php and test."
echo "Expected:"
echo " - When you click Join, MIC and CAM buttons light ON immediately"
echo " - After connect completes, they remain ON because both tracks are published"
