#!/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) Add startup flags to JOIN_DEFAULTS */
$search1 = <<<'TXT'
  window.JOIN_DEFAULTS = {
    projectId: <?php echo json_encode($projectId); ?>,
    tokenEndpoint: <?php echo json_encode($tokenEndpoint); ?>,
    roomName: <?php echo json_encode($roomName); ?>,
TXT;

$replace1 = <<<'TXT'
  window.JOIN_DEFAULTS = {
    projectId: <?php echo json_encode($projectId); ?>,
    tokenEndpoint: <?php echo json_encode($tokenEndpoint); ?>,
    roomName: <?php echo json_encode($roomName); ?>,
    autoPublishCam: true,
    autoPublishMic: false,
TXT;

$join = replaceOnceOrKeep($join, $search1, $replace1, 'JOIN_DEFAULTS startup flags');

/* 2) Auto-publish camera immediately after connect */
$search2 = <<<'TXT'
      buildShare();
      refreshGuestStrip();

      // local screen stays "Not publishing" until MIC/CAM pressed
      detachLocal();
      if (localVU) localVU.setIdle();
TXT;

$replace2 = <<<'TXT'
      buildShare();
      refreshGuestStrip();

      // Auto-publish guest camera on join so guest appears with video in coproducer.
      try{
        const defaults = window.JOIN_DEFAULTS || {};
        if (defaults.autoPublishCam) {
          await ensureLocalCam();
        } else {
          detachLocal();
        }
        if (defaults.autoPublishMic) {
          await ensureLocalMic();
        } else if (localVU) {
          localVU.setIdle();
        }
      }catch(e){
        console.error("Auto-publish startup failed:", e);
      }
TXT;

$join = replaceOnceOrKeep($join, $search2, $replace2, 'auto publish after connect');

/* 3) Make the UI status explicit after connect */
$search3 = <<<'TXT'
        appendBubble({ from:"System", text:`Joined room: ${roomName}`, time: nowTime(), mine:false });
TXT;

$replace3 = <<<'TXT'
        appendBubble({ from:"System", text:`Joined room: ${roomName}`, time: nowTime(), mine:false });
        appendBubble({ from:"System", text:`Camera will publish automatically after connect.`, time: nowTime(), mine:false });
TXT;

$join = replaceOnceOrKeep($join, $search3, $replace3, 'status message');

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 join.php and retest."
echo "Expected result: guest publishes video automatically after joining the room."
