﻿from pathlib import Path
import re

HTML = Path('/opt/ai-avatar-demo/services/livekit-web-smoke-r2g/index_gate7n_b_r2g.html')
text = HTML.read_text(encoding='utf-8', errors='replace')

if 'Gate7N-B-R2g LiveKit Mic Smoke' not in text:
    raise SystemExit('BLOCKED_NOT_R2G_HTML')
if 'gate7n-b-r2g-room' not in text:
    raise SystemExit('BLOCKED_ROUTE_CONSTANT_DRIFT')
if 'browser-mic-user-r2g' not in text:
    raise SystemExit('BLOCKED_ROUTE_CONSTANT_DRIFT')
if 'ws://192.168.0.2:7880' not in text:
    raise SystemExit('BLOCKED_ROUTE_CONSTANT_DRIFT')

DASHBOARD = """
<div id="target-dashboard" style="border:2px solid #2563eb;padding:12px;margin:12px 0;background:#eff6ff;color:#111827;font-family:monospace;line-height:1.55">
  <div><b>TEST_TARGET</b> = Gate7N-B-R2g</div>
  <div><b>EXPECTED_ROOM</b> = gate7n-b-r2g-room</div>
  <div><b>EXPECTED_IDENTITY</b> = browser-mic-user-r2g</div>
  <div><b>EXPECTED_URL</b> = ws://192.168.0.2:7880</div>
  <div id="target-check"><b>STATUS</b> = waiting_for_connect</div>
</div>
"""

HELPER = r"""
const EXPECTED_TARGET = {
  page: 'Gate7N-B-R2g',
  room: 'gate7n-b-r2g-room',
  identity: 'browser-mic-user-r2g',
  url: 'ws://192.168.0.2:7880',
};
function readableLog(level, msg, obj) {
  const payload = obj ? ' ' + JSON.stringify(obj) : '';
  log(`[${level}] ${msg}${payload}`);
}
function setTargetStatus(text, ok=false) {
  const el = document.getElementById('target-check');
  if (el) {
    el.innerHTML = `<b>STATUS</b> = ${text}`;
    el.style.color = ok ? '#047857' : '#b91c1c';
  }
}
function validateTokenTarget(data) {
  const actual = { room: data.room, identity: data.identity, url: data.url };
  const mismatches = [];
  if (actual.room !== EXPECTED_TARGET.room) mismatches.push(`room expected=${EXPECTED_TARGET.room} actual=${actual.room}`);
  if (actual.identity !== EXPECTED_TARGET.identity) mismatches.push(`identity expected=${EXPECTED_TARGET.identity} actual=${actual.identity}`);
  if (actual.url !== EXPECTED_TARGET.url) mismatches.push(`url expected=${EXPECTED_TARGET.url} actual=${actual.url}`);
  if (mismatches.length) {
    readableLog('FAIL', 'WRONG_TEST_TARGET', { expected: EXPECTED_TARGET, actual, mismatches });
    setTargetStatus('FAIL_WRONG_TEST_TARGET', false);
    throw new Error('WRONG_TEST_TARGET: ' + mismatches.join(' | '));
  }
  readableLog('PASS', 'TOKEN_TARGET_OK', actual);
  setTargetStatus('PASS_TOKEN_TARGET_OK', true);
}
"""

changed = False

if 'id="target-dashboard"' not in text:
    if '<pre id="logBox"' in text:
        text = text.replace('<pre id="logBox"', DASHBOARD + '\n<pre id="logBox"', 1)
        changed = True
    elif '<div id="logBox"' in text:
        text = text.replace('<div id="logBox"', DASHBOARD + '\n<div id="logBox"', 1)
        changed = True
    else:
        raise SystemExit('BLOCKED_LOG_CONTAINER_NOT_FOUND')

if 'const EXPECTED_TARGET' not in text:
    if '<script>' not in text:
        raise SystemExit('BLOCKED_SCRIPT_TAG_NOT_FOUND')
    text = text.replace('<script>', '<script>\n' + HELPER, 1)
    changed = True

if 'validateTokenTarget(data)' not in text:
    token_line = "log('TOKEN_OK room=' + data.room + ' identity=' + data.identity + ' url=' + data.url);"
    if token_line in text:
        text = text.replace(token_line, token_line + "\n        validateTokenTarget(data);", 1)
        changed = True
    else:
        new_text = re.sub(
            r"(const\s+data\s*=\s*await\s+res\.json\(\);)",
            r"\1\n        readableLog('TOKEN', 'TOKEN_JSON_RECEIVED', data);\n        validateTokenTarget(data);",
            text,
            count=1,
        )
        if new_text == text:
            raise SystemExit('BLOCKED_PATCHER_PATTERN_NOT_FOUND')
        text = new_text
        changed = True

if 'CLICK_RECEIVED' not in text:
    marker = "document.getElementById('connectBtn').onclick = async () => {"
    if marker in text:
        text = text.replace(marker, marker + "\n      readableLog('STEP', 'CLICK_RECEIVED');", 1)
        changed = True
    else:
        raise SystemExit('BLOCKED_CONNECT_FUNCTION_PATTERN_NOT_FOUND')

text = text.replace("log('STEP client start R2g');", "readableLog('STEP', 'client start R2g');")
text = text.replace('log("STEP client start R2g");', "readableLog('STEP', 'client start R2g');")

if 'EXPECTED_URL</b> = ws://127.0.0.1:7880' in text:
    raise SystemExit('BLOCKED_ROUTE_CONSTANT_DRIFT')
if 'EXPECTED_ROOM</b> = gate7n-b-r2-room' in text:
    raise SystemExit('BLOCKED_ROUTE_CONSTANT_DRIFT')
if 'EXPECTED_IDENTITY</b> = browser-mic-user-r2' in text and 'browser-mic-user-r2g' not in text:
    raise SystemExit('BLOCKED_ROUTE_CONSTANT_DRIFT')

if changed:
    HTML.write_text(text, encoding='utf-8')
    print('PATCH_APPLIED')
else:
    print('NO_CHANGE_NEEDED')
