// ============================================================
// AccessGate — porta de entrada com senha.
//
// ⚠️ SEGURANÇA: uma senha conferida só no front é contornável
// (qualquer um lê o JS). A proteção REAL precisa ser server-side:
// uma function na Vercel que lê a senha das Environment Variables
// e responde ok/erro — e os endpoints sensíveis (ex.: /api/analisar-exame)
// também precisam exigir essa sessão.
//
// Em produção, defina antes deste script carregar:
//     window.BLIFE_AUTH_API = '/api/login';
// e o gate passa a valer (a senha vive só na Vercel, nunca no front).
// Sem essa variável, o gate fica desativado (preview/protótipo).
//
// Contrato do endpoint (o backend implementa na Vercel):
//   POST /api/login   body: { password: string }
//   - senha correta → 200 { ok: true }  (idealmente seta cookie httpOnly de sessão)
//   - senha errada  → 401/403            (ou 200 { ok: false })
//   A senha fica em process.env.BLIFE_ACCESS_PASSWORD (Environment Variable).
// ============================================================

const AUTH_API = (typeof window !== 'undefined' && window.BLIFE_AUTH_API) || '';

// O gate só é exigido quando há um validador no backend configurado.
// Sem AUTH_API (ex.: protótipo/preview), não bloqueia — porque a senha
// NÃO deve viver no front; ela fica só nas Environment Variables da Vercel.
function blifeAuthRequired() { return !!AUTH_API; }

const AUTH_KEY = 'blife.auth';
const AUTH_TTL = 12 * 60 * 60 * 1000; // 12h — depois disso pede senha de novo

function blifeIsAuthed() {
  try { const v = JSON.parse(localStorage.getItem(AUTH_KEY) || 'null'); return !!(v && v.exp > Date.now()); }
  catch (e) { return false; }
}
function blifeSetAuthed() {
  try { localStorage.setItem(AUTH_KEY, JSON.stringify({ exp: Date.now() + AUTH_TTL })); } catch (e) {}
}
function blifeClearAuth() {
  try { localStorage.removeItem(AUTH_KEY); } catch (e) {}
}

async function validateAccess(pw) {
  // Validação é sempre server-side: a senha vive só nas Environment
  // Variables da Vercel; o front nunca a conhece.
  if (!AUTH_API) return false;
  let res;
  try {
    res = await fetch(AUTH_API, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      credentials: 'include',
      body: JSON.stringify({ password: pw }),
    });
  } catch (e) {
    throw new Error('Não foi possível validar agora. Verifique a conexão e tente de novo.');
  }
  if (res.status === 401 || res.status === 403) return false;
  if (!res.ok) throw new Error('Erro ao validar o acesso (' + res.status + ').');
  const data = await res.json().catch(() => ({}));
  return data.ok !== false;
}

function AccessGate({ onUnlock }) {
  const [pw, setPw] = React.useState('');
  const [err, setErr] = React.useState('');
  const [busy, setBusy] = React.useState(false);
  const inputRef = React.useRef(null);

  React.useEffect(() => { if (inputRef.current) inputRef.current.focus(); }, []);

  const submit = async (e) => {
    if (e) e.preventDefault();
    const v = pw.trim();
    if (!v || busy) return;
    setBusy(true); setErr('');
    try {
      const ok = await validateAccess(v);
      if (ok) { blifeSetAuthed(); onUnlock(); }
      else { setErr('Senha incorreta. Tente novamente.'); setBusy(false); }
    } catch (ex) {
      setErr(ex.message || 'Erro ao validar o acesso.');
      setBusy(false);
    }
  };

  return (
    <div className="gate">
      <form className="gate-card" onSubmit={submit}>
        <img className="gate-logo" src="assets/blife-symbol-molecule.svg" alt="B-Life"/>
        <div className="gate-eyebrow">B-Life Clinic</div>
        <h1 className="gate-title">Plano de Ação</h1>
        <p className="gate-sub">Acesso restrito à equipe clínica. Informe a senha para continuar.</p>
        <input
          ref={inputRef}
          type="password"
          className="input gate-input"
          value={pw}
          onChange={e => { setPw(e.target.value); if (err) setErr(''); }}
          placeholder="Senha de acesso"
          autoComplete="current-password"
        />
        {err && <div className="gate-err"><Ico.Warn/> {err}</div>}
        <button type="submit" className="btn primary gate-btn" disabled={busy || !pw.trim()}>
          {busy ? 'Validando…' : 'Entrar'}
        </button>
      </form>
      <div className="gate-foot">Protegido · B-Life Clinic</div>
    </div>
  );
}

Object.assign(window, { AccessGate, blifeIsAuthed, blifeSetAuthed, blifeClearAuth, blifeAuthRequired });
