<?php
$u=current_user();
?>
<section class="page-intro"><div><span class="mini-label">📷 QR CODE</span><h2>Ler QR Code de integração e vínculo</h2><p>Aponte a câmera para um convite de integração, empresa ou prestador.</p></div><div class="actions"><a class="btn btn-secondary btn-sm" href="dashboard.php?page=affiliations">← Meus Vínculos</a></div></section>

<section class="panel" style="max-width:760px;margin-inline:auto">
  <div class="panel-header"><div><h3>Escanear com a câmera</h3><p>Autorize o uso da câmera quando o navegador solicitar.</p></div></div>
  <div data-qr-camera-box style="position:relative;overflow:hidden;border:1px solid var(--border);border-radius:20px;background:#070812;min-height:300px;display:grid;place-items:center">
    <video data-qr-video playsinline muted style="width:100%;max-height:62vh;object-fit:cover;display:none"></video>
    <div data-qr-placeholder style="text-align:center;padding:42px 20px;color:var(--muted)"><div style="font-size:4rem;margin-bottom:10px">📷</div><strong style="display:block;color:var(--text);margin-bottom:7px">Câmera desligada</strong><span>Toque em “Acessar câmera” para começar.</span></div>
    <div data-qr-guide hidden style="position:absolute;inset:17% 12%;border:3px solid var(--accent);border-radius:24px;box-shadow:0 0 0 9999px rgba(0,0,0,.18);pointer-events:none"></div>
  </div>

  <div class="actions" style="margin-top:15px">
    <button class="btn btn-primary" type="button" data-qr-start>📷 Acessar Câmera</button>
    <button class="btn btn-secondary" type="button" data-qr-stop disabled>■ Fechar câmera</button>
    <label class="btn btn-secondary" style="cursor:pointer">📸 Tirar foto do QR<input data-qr-file type="file" accept="image/*" capture="environment" hidden></label>
  </div>
  <div class="notice" data-qr-status style="margin-top:15px"><strong>Status:</strong> câmera aguardando.</div>
</section>

<section class="panel" style="max-width:760px;margin-inline:auto">
  <div class="panel-header"><div><h3>Alternativa pelo link</h3><p>Se o navegador não liberar o leitor, cole aqui o link do convite que acompanha o QR Code.</p></div></div>
  <div class="inline-filter"><input class="input" data-qr-manual placeholder="https://seusite.com/integration_join.php?..."><button class="btn btn-secondary" type="button" data-qr-open-link>Acessar Convite</button></div>
</section>

<script>
(function(){
  const video=document.querySelector('[data-qr-video]');
  const placeholder=document.querySelector('[data-qr-placeholder]');
  const guide=document.querySelector('[data-qr-guide]');
  const startBtn=document.querySelector('[data-qr-start]');
  const stopBtn=document.querySelector('[data-qr-stop]');
  const statusBox=document.querySelector('[data-qr-status]');
  const fileInput=document.querySelector('[data-qr-file]');
  const manual=document.querySelector('[data-qr-manual]');
  const openManual=document.querySelector('[data-qr-open-link]');
  let stream=null,detector=null,running=false,raf=0,lastInvalid='';

  function status(message,type){
    if(!statusBox)return;
    const icons={ok:'✅',error:'⚠️',scan:'🔎',info:'ℹ️'};
    statusBox.innerHTML='<strong>'+ (icons[type]||'ℹ️') +' Status:</strong> '+message;
  }
  function inviteUrl(raw){
    raw=String(raw||'').trim(); if(!raw)return null;
    let u; try{u=new URL(raw,window.location.href)}catch(e){return null;}
    if(u.origin!==window.location.origin)return null;
    const path=u.pathname.replace(/\/+$/,'');
    const isCompany=path.endsWith('/company_join.php')||path==='/company_join.php';
    const isProvider=path.endsWith('/provider_join.php')||path==='/provider_join.php';
    const isIntegration=path.endsWith('/integration_join.php')||path==='/integration_join.php';
    if(!isCompany&&!isProvider&&!isIntegration)return null;
    const id=isCompany?u.searchParams.get('company_id'):(isProvider?u.searchParams.get('provider_id'):u.searchParams.get('link_id'));
    if(!/^\d+$/.test(id||''))return null;
    if(!(u.searchParams.get('token')||'').trim())return null;
    return u.href;
  }
  function go(raw){
    const url=inviteUrl(raw);
    if(!url){lastInvalid=String(raw||'');status('QR lido, mas ele não é um convite válido desta plataforma.','error');return false;}
    stopCamera();status('Convite reconhecido. Abrindo o cadastro…','ok');
    setTimeout(()=>{window.location.href=url},250);return true;
  }
  async function ensureDetector(){
    if(detector)return detector;
    if(!('BarcodeDetector' in window))throw new Error('Este navegador não possui leitor de QR integrado. Use Chrome/Brave atualizado ou a câmera normal do aparelho.');
    try{
      if(typeof BarcodeDetector.getSupportedFormats==='function'){
        const formats=await BarcodeDetector.getSupportedFormats();
        if(Array.isArray(formats)&&formats.length&&!formats.includes('qr_code'))throw new Error('O navegador não oferece leitura de QR Code.');
      }
      detector=new BarcodeDetector({formats:['qr_code']});return detector;
    }catch(e){throw e;}
  }
  async function scanFrame(){
    if(!running)return;
    try{
      if(video.readyState>=2){
        const codes=await detector.detect(video);
        if(codes&&codes.length){
          const raw=(codes[0].rawValue||'').trim();
          if(raw&&raw!==lastInvalid&&go(raw))return;
        }
      }
    }catch(e){}
    if(running)raf=requestAnimationFrame(scanFrame);
  }
  async function startCamera(){
    if(running)return;
    if(!window.isSecureContext){status('A câmera do navegador exige HTTPS. Abra a plataforma usando https://','error');return;}
    if(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia){status('Este navegador não disponibilizou acesso à câmera.','error');return;}
    try{
      status('solicitando permissão da câmera…','info');
      await ensureDetector();
      stream=await navigator.mediaDevices.getUserMedia({audio:false,video:{facingMode:{ideal:'environment'},width:{ideal:1280},height:{ideal:720}}});
      video.srcObject=stream;await video.play();running=true;
      video.style.display='block';placeholder.style.display='none';guide.hidden=false;startBtn.disabled=true;stopBtn.disabled=false;
      status('aponte a câmera para o QR Code de integração, empresa ou prestador.','scan');scanFrame();
    }catch(e){
      const msg=(e&&e.name==='NotAllowedError')?'Permissão da câmera negada. Libere a câmera nas permissões do navegador e tente novamente.':(e&&e.message?e.message:'Não foi possível acessar a câmera.');
      status(msg,'error');stopCamera();
    }
  }
  function stopCamera(){
    running=false;if(raf)cancelAnimationFrame(raf);raf=0;
    if(stream){stream.getTracks().forEach(t=>t.stop());stream=null;}
    if(video){video.pause();video.srcObject=null;video.style.display='none';}
    if(placeholder)placeholder.style.display='block';if(guide)guide.hidden=true;
    if(startBtn)startBtn.disabled=false;if(stopBtn)stopBtn.disabled=true;
  }
  async function scanFile(file){
    if(!file)return;
    try{
      status('analisando a foto do QR Code…','scan');const d=await ensureDetector();
      const bitmap=await createImageBitmap(file);const codes=await d.detect(bitmap);if(bitmap.close)bitmap.close();
      if(codes&&codes.length){if(!go(codes[0].rawValue||''))return;}else status('Nenhum QR Code foi encontrado nessa imagem.','error');
    }catch(e){status(e&&e.message?e.message:'Não foi possível ler a imagem.','error');}
    finally{fileInput.value='';}
  }

  startBtn&&startBtn.addEventListener('click',startCamera);
  stopBtn&&stopBtn.addEventListener('click',()=>{stopCamera();status('câmera fechada.','info')});
  fileInput&&fileInput.addEventListener('change',()=>scanFile(fileInput.files&&fileInput.files[0]));
  openManual&&openManual.addEventListener('click',()=>{if(!go(manual.value))manual.focus()});
  manual&&manual.addEventListener('keydown',e=>{if(e.key==='Enter'){e.preventDefault();openManual.click();}});
  window.addEventListener('pagehide',stopCamera);
})();
</script>
