/* OK ITHAKI V249435 — real Tor-safe transport, encrypted Neighborhood Mesh and secure FCM diagnostics. */
(() => {
  'use strict';
  if (window.__ITHAKI_PRIVACY_TRANSPORT_V249435__) return;
  window.__ITHAKI_PRIVACY_TRANSPORT_V249435__ = true;
  const VER='V249435-tor-mesh-fcm-security';
  const $=id=>document.getElementById(id);
  const esc=v=>String(v==null?'':v).replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));
  const bridge=()=>{try{return window.OKITHAKI_ANDROID||window.AndroidBridge||null}catch(e){return null}};
  const parse=(v,f={})=>{try{return JSON.parse(String(v||''))}catch(e){return f}};
  const toast=t=>{try{if(window.toast)return window.toast(t,6000);if(window.ITH&&ITH.toast)return ITH.toast(t,6000)}catch(e){}console.log(t)};
  const menu=()=>$('memberMenu');
  const close=()=>{const m=menu();if(m){m.classList.remove('show','localPanel');m.innerHTML=''}return false};
  const nativeCall=(name,...args)=>{const b=bridge();if(!b||typeof b[name]!=='function')return null;try{return b[name](...args)}catch(e){return null}};
  const torStatus=()=>parse(nativeCall('torStatusV249435')||nativeCall('torStatusV249396')||'{}',{ok:false,native_proxy_active:false,tor_safe_requested:false,reason:'android_apk_required'});
  const meshStatus=()=>parse(nativeCall('meshStatusV249435')||nativeCall('getMeshNetworkSummary')||'{}',{ok:false,enabled:false,reason:'android_apk_required'});
  const bool=(v)=>v?'ΝΑΙ':'ΟΧΙ';

  async function serverDiag(){
    try{const r=await fetch('/api/diagnostics/v249435?_='+Date.now(),{cache:'no-store'});return await r.json()}catch(e){return{ok:false,reason:'server_unreachable'}}
  }
  function head(title,sub){return `<div class="ith435Head"><button type="button" data-close435>‹</button><div><b>${title}</b><small>${sub}</small></div><button type="button" data-close435>×</button></div>`}
  function row(label,value,good=false){return `<div class="ith435Row"><span>${esc(label)}</span><b class="${good?'good':''}">${esc(value)}</b></div>`}

  async function openCenter(){
    const m=menu();if(!m)return false;const ts=torStatus(),ms=meshStatus();m.classList.add('show','localPanel');
    m.innerHTML=`<div class="ith435Panel">${head('🛡️ Κέντρο Ιδιωτικής Σύνδεσης','TOR · Mesh Γειτονιά · FCM κρυπτογράφησης')}
      <section class="ith435Hero tor"><b>🧅 TOR Safe Mode</b><span>Δρομολόγηση του Android WebView μέσω Orbot SOCKS, χωρίς κανόνα απευθείας παράκαμψης.</span></section>
      <div id="ith435TorState" class="ith435Grid">${row('Ζητήθηκε TOR',bool(ts.tor_safe_requested),ts.tor_safe_requested)}${row('Native proxy ενεργό',bool(ts.native_proxy_active),ts.native_proxy_active)}${row('Έλεγχος Tor',bool(ts.tor_verified),ts.tor_verified)}${row('Orbot / SOCKS',`${bool(ts.external_orbot_detected)} / ${bool(ts.orbot_socks_open)}`,ts.orbot_socks_open)}</div>
      <div class="ith435Warn">Όταν ενεργοποιείται TOR, η ΙΘΑΚΗ κλείνει FCM, κλήσεις WebRTC και το τοπικό Mesh. Έτσι δεν δημιουργούνται παράλληλες απευθείας συνδέσεις έξω από το WebView.</div>
      <div class="ith435Actions"><button id="ith435OpenOrbot">🧅 Άνοιγμα Orbot</button><button id="ith435EnableTor" class="primary">Ενεργοποίηση TOR</button><button id="ith435DisableTor">Απενεργοποίηση</button></div>
      <section class="ith435Hero mesh"><b>📡 Mesh Γειτονιά</b><span>Κρυπτογραφημένα μηνύματα σε συσκευές του ίδιου Wi‑Fi ή hotspot, με αυτόματη προώθηση.</span></section>
      <div class="ith435Grid">${row('Mesh ενεργό',bool(ms.enabled),ms.enabled)}${row('Τοπικός κόμβος',bool(ms.node_running),ms.node_running)}${row('AES‑256‑GCM',bool(ms.encrypted_aes_256_gcm),ms.encrypted_aes_256_gcm)}${row('Αυτόματο relay',bool(ms.automatic_store_and_forward_relay),ms.automatic_store_and_forward_relay)}${row('Αυτόματο Wi‑Fi Direct',bool(ms.wifi_direct_auto_group_active),false)}</div>
      <label class="ith435Input"><span>Κοινός κωδικός Mesh — τουλάχιστον 12 χαρακτήρες</span><input id="ith435MeshCode" type="password" autocomplete="new-password" placeholder="Ίδιος κωδικός σε όλες τις συσκευές"></label>
      <div class="ith435Actions"><button id="ith435EnableMesh" class="primary">Ενεργοποίηση Mesh</button><button id="ith435ScanMesh">🔎 Σάρωση κόμβων</button><button id="ith435DisableMesh">Κλείσιμο Mesh</button><button id="ith435Hotspot">Hotspot</button></div>
      <section class="ith435Hero fcm"><b>🔔 FCM ασφαλών μηνυμάτων</b><span>Το FCM μεταφέρει μόνο wake metadata για κρυπτογραφημένα μηνύματα· το περιεχόμενο ανακτάται από την ΙΘΑΚΗ και δεν εμφανίζεται στην οθόνη κλειδώματος.</span></section>
      <div id="ith435FcmState" class="ith435Grid">${row('Έλεγχος server','…')}</div><div id="ith435Result" class="ith435Result"></div></div>`;
    m.querySelectorAll('[data-close435]').forEach(x=>x.onclick=close);
    const result=$('ith435Result');
    $('ith435OpenOrbot').onclick=()=>{const d=parse(nativeCall('openOrbotV249435')||'{}');result.textContent=d.opened?'Το Orbot άνοιξε. Περίμενε να ολοκληρωθεί η σύνδεση.':'Το νέο Android APK και το Orbot απαιτούνται.'};
    $('ith435EnableTor').onclick=()=>{result.textContent='Εφαρμογή TOR Safe Mode…';const d=parse(nativeCall('enableTorSafeModeV249435')||'{}');result.textContent=d.native_proxy_active?'TOR ενεργό. Η σελίδα θα φορτωθεί μέσω Orbot.':'Δεν έγινε σύνδεση. Άνοιξε/σύνδεσε το Orbot. Η απευθείας σύνδεση παραμένει κλειστή.'};
    $('ith435DisableTor').onclick=()=>{const d=parse(nativeCall('disableTorSafeModeV249435')||'{}');result.textContent=d.ok?'TOR απενεργοποιήθηκε. Επανέρχονται οι κανονικές λειτουργίες.':'Δεν ολοκληρώθηκε η αλλαγή.'};
    $('ith435EnableMesh').onclick=()=>{const code=$('ith435MeshCode').value.trim();const d=parse(nativeCall('enableMeshV249435',code)||'{}');result.textContent=d.ok?`Mesh ενεργό · αποτύπωμα κωδικού ${d.fingerprint||''}`:(d.reason==='tor_safe_mode_blocks_local_mesh'?'Κλείσε πρώτα το TOR.':'Ο κωδικός πρέπει να έχει τουλάχιστον 12 χαρακτήρες και να είναι ίδιος σε όλες τις συσκευές.')};
    $('ith435DisableMesh').onclick=()=>{const d=parse(nativeCall('disableMeshV249435')||'{}');result.textContent=d.ok?'Το Mesh έκλεισε.':'Απαιτείται το Android APK V249435.'};
    $('ith435ScanMesh').onclick=()=>{const d=parse(nativeCall('scanPhoneNodes')||'{}');result.textContent=d.ok?`Βρέθηκαν ${Number(d.count||0)} κρυπτογραφημένοι κόμβοι V249435.`:'Ενεργοποίησε πρώτα το Mesh με κοινό κωδικό.'};
    $('ith435Hotspot').onclick=()=>nativeCall('openHotspotSettings');
    const sd=await serverDiag();const f=$('ith435FcmState');if(f)f.innerHTML=row('FCM server διαθέσιμο',bool(sd.fcm_server_enabled),sd.fcm_server_enabled)+row('Secure wakes data-only',bool(sd.fcm_secure_wakes_data_only),sd.fcm_secure_wakes_data_only)+row('Standard AES wake data-only',bool(sd.fcm_standard_aes_wake_data_only),sd.fcm_standard_aes_wake_data_only)+row('Περιεχόμενο μέσα στο FCM',sd.fcm_encrypted_content_included?'ΝΑΙ':'ΟΧΙ',!sd.fcm_encrypted_content_included)+row('Ιδιωτικό κανάλι Android',bool(sd.android_secure_notification_channel),sd.android_secure_notification_channel);
    return false;
  }

  function installProfileButton(){
    const page=$('profilePage');if(!page)return;const old=page.querySelector('[data-tor-profile-v249396]');if(old){old.setAttribute('data-tor-profile-v249435','1');const b=old.querySelector('button');if(b){b.onclick=openCenter;const sm=b.querySelector('small');if(sm)sm.textContent='Πραγματικό TOR μέσω Orbot · Κρυπτογραφημένο Mesh · FCM ιδιωτικότητας';const st=b.querySelector('.status');if(st){const t=torStatus();st.textContent=t.native_proxy_active?'TOR ΕΝΕΡΓΟ':'Κέντρο ασφάλειας';}}return}
    if(page.querySelector('[data-privacy-v249435]'))return;const wrap=page.querySelector('.profileCleanWrap')||page.firstElementChild;if(!wrap)return;const sec=document.createElement('section');sec.className='card profilePanelClean ith435Profile';sec.dataset.privacyV249435='1';sec.innerHTML='<button type="button"><span>🛡️</span><span><b>Ιδιωτική σύνδεση</b><small>TOR · Mesh Γειτονιά · FCM κρυπτογράφησης</small></span><strong>Άνοιγμα</strong></button>';sec.querySelector('button').onclick=openCenter;wrap.prepend(sec);
  }

  function installCallGuards(){
    const targets=[['startVoiceCall','φωνητική κλήση'],['startVideoCall','βιντεοκλήση']];window.ITH=window.ITH||{};
    for(const [name,label] of targets){const fn=window.ITH[name]||window[name];if(typeof fn!=='function'||fn.__torGuard435)continue;const wrapped=function(...a){const t=torStatus();if(t.tor_safe_requested){toast(`Το TOR Safe Mode δεν επιτρέπει ${label}, επειδή το WebRTC μπορεί να ανοίξει απευθείας σύνδεση.`);return false}return fn.apply(this,a)};wrapped.__torGuard435=true;wrapped.__raw=fn;window.ITH[name]=wrapped;window[name]=wrapped;}
  }
  function installMeshOverride(){window.ITH=window.ITH||{};window.ITH.openPrivacyTransportV249435=openCenter;window.ITH.openEmergencyOfflineHubV249283=openCenter;window.openEmergencyOfflineHubV249283=openCenter;}
  function css(){if($('ith435Css'))return;const st=document.createElement('style');st.id='ith435Css';st.textContent=`.ith435Panel{display:grid;gap:12px;max-height:88vh;overflow:auto;padding:2px 2px 22px;color:#fff}.ith435Head{position:sticky;top:0;z-index:8;display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:center;background:rgba(4,12,22,.97);border:1px solid rgba(255,215,120,.22);border-radius:18px;padding:10px}.ith435Head button{width:42px;height:42px;border-radius:14px;border:1px solid rgba(255,255,255,.15);background:rgba(255,255,255,.07);color:#fff;font-size:22px}.ith435Head div{display:grid;gap:3px}.ith435Head b{color:#ffe09a}.ith435Head small{color:#9eb4c9}.ith435Hero{display:grid;gap:5px;padding:14px;border-radius:18px;border:1px solid rgba(255,255,255,.16);background:linear-gradient(135deg,rgba(255,255,255,.08),rgba(255,255,255,.025))}.ith435Hero.tor{border-color:rgba(190,126,255,.45)}.ith435Hero.mesh{border-color:rgba(83,220,190,.4)}.ith435Hero.fcm{border-color:rgba(90,170,255,.42)}.ith435Hero span,.ith435Warn{font-size:12px;line-height:1.5;color:#bdd0e1}.ith435Warn{padding:12px;border-radius:15px;background:rgba(255,177,70,.1);border:1px solid rgba(255,177,70,.3)}.ith435Grid{display:grid;grid-template-columns:1fr;gap:6px}.ith435Row{display:grid;grid-template-columns:1fr auto;gap:10px;padding:9px 11px;border-radius:13px;background:rgba(255,255,255,.045)}.ith435Row b{color:#ffbf9d}.ith435Row b.good{color:#85efc3}.ith435Actions{display:flex;flex-wrap:wrap;gap:8px}.ith435Actions button{flex:1 1 140px;min-height:44px;border-radius:14px;border:1px solid rgba(255,255,255,.16);background:rgba(255,255,255,.075);color:#fff;font-weight:800}.ith435Actions button.primary{background:linear-gradient(135deg,#a05de8,#4c73df)}.ith435Input{display:grid;gap:6px;font-size:12px;color:#bdd0e1}.ith435Input input{width:100%;box-sizing:border-box;border-radius:14px;border:1px solid rgba(255,255,255,.2);background:#07131f;color:#fff;padding:12px}.ith435Result{min-height:24px;color:#ffe09a;font-size:12px}.ith435Profile button{width:100%;display:grid;grid-template-columns:auto 1fr auto;gap:12px;align-items:center;border:1px solid rgba(155,110,255,.4);background:linear-gradient(135deg,rgba(74,31,110,.42),rgba(5,18,30,.88));color:#fff;border-radius:18px;padding:13px;text-align:left}.ith435Profile button>span:first-child{font-size:30px}.ith435Profile button>span:nth-child(2){display:grid;gap:3px}.ith435Profile small{color:#aebfd0}.ith435Profile strong{color:#e8c7ff;font-size:11px}`;document.head.appendChild(st)}
  function install(){css();installProfileButton();installCallGuards();installMeshOverride();document.documentElement.setAttribute('data-ithaki-v249435',VER)}
  window.ITH=window.ITH||{};Object.assign(window.ITH,{openPrivacyTransportV249435:openCenter,torStatusV249435:torStatus,meshStatusV249435:meshStatus});
  install();new MutationObserver(install).observe(document.documentElement,{subtree:true,childList:true});setInterval(install,1100);
})();
