/* ============================================================
   SIGNUP STEP — cadastro na plataforma antes do checkout
   ------------------------------------------------------------
   Fluxo: o visitante escolhe o plano no modal → cai nesta tela
   (mesmo modal, mesma identidade visual) → cria a conta oficial
   da plataforma (mesmo Supabase do login.talentums.com.br) →
   só então vai pro link de pagamento.

   A conta e os dados de contato (nome · e-mail · WhatsApp) ficam
   salvos mesmo se ele desistir do pagamento depois.
   ============================================================ */
const { useState: useSignupState, useRef: useSignupRef } = React;

const onlyDigits = (v) => (v || "").replace(/\D+/g, "");

function maskPhoneBR(v) {
  const d = onlyDigits(v).slice(0, 11);
  if (!d) return "";
  if (d.length <= 2) return `(${d}`;
  if (d.length <= 6) return `(${d.slice(0, 2)}) ${d.slice(2)}`;
  if (d.length <= 10) return `(${d.slice(0, 2)}) ${d.slice(2, 6)}-${d.slice(6)}`;
  return `(${d.slice(0, 2)}) ${d.slice(2, 7)}-${d.slice(7)}`;
}

const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[a-z]{2,}$/i;

/** Mensagens do Supabase → português direto. */
function traduzErro(raw) {
  const m = (raw || "").toLowerCase();
  if (m.includes("password") && (m.includes("short") || m.includes("least"))) return "A senha precisa ter no mínimo 8 caracteres.";
  if (m.includes("invalid email") || m.includes("email address")) return "Confira o e-mail digitado.";
  if (m.includes("rate limit") || m.includes("too many")) return "Muitas tentativas seguidas. Aguarde um minuto e tente de novo.";
  if (m.includes("signups not allowed") || m.includes("disabled")) return "Cadastro temporariamente indisponível. Fale com a equipe pelo WhatsApp.";
  return "Não conseguimos criar a conta agora. Tente de novo em instantes.";
}

function SignupStep({ plan, cfg, onBack, onDone }) {
  const sb = (cfg && cfg.supabase) || {};
  const [nome, setNome] = useSignupState("");
  const [email, setEmail] = useSignupState("");
  const [fone, setFone] = useSignupState("");
  const [senha, setSenha] = useSignupState("");
  const [erro, setErro] = useSignupState("");
  const [estado, setEstado] = useSignupState("form"); // form | enviando | existe | ok
  const erroRef = useSignupRef(null);

  const podeEnviar = estado === "form" || estado === "existe";

  async function submit(e) {
    e.preventDefault();
    if (!podeEnviar) return;

    const nomeLimpo = nome.trim();
    const emailLimpo = email.trim().toLowerCase();
    const digitos = onlyDigits(fone);

    if (nomeLimpo.length < 3) return setErro("Escreva o nome completo.");
    if (!EMAIL_RE.test(emailLimpo)) return setErro("Confira o e-mail digitado.");
    if (digitos.length < 10 || digitos.length > 11) return setErro("Informe o WhatsApp com DDD, ex: (48) 99160-8052.");
    if (senha.length < 8) return setErro("A senha precisa ter no mínimo 8 caracteres.");
    if (!sb.url || !sb.anonKey) return setErro("Cadastro indisponível no momento. Fale com a equipe pelo WhatsApp.");

    setErro("");
    setEstado("enviando");
    if (window.track) window.track("signup_submit", { plan: plan.id });

    try {
      const res = await fetch(`${sb.url}/auth/v1/signup`, {
        method: "POST",
        headers: { apikey: sb.anonKey, "Content-Type": "application/json" },
        body: JSON.stringify({
          email: emailLimpo,
          password: senha,
          data: {
            full_name: nomeLimpo,
            whatsapp: `+55${digitos}`,
            origem: "site-talentums",
            plano: plan.id,
          },
        }),
      });
      const data = await res.json().catch(() => ({}));

      // E-mail já cadastrado: o Supabase responde 422 ou devolve 200 com
      // identities vazio (proteção contra descoberta de e-mails).
      const jaExiste =
        data.error_code === "user_already_exists" ||
        /already registered|already been registered/i.test(data.msg || data.message || "") ||
        (res.ok && data.user && Array.isArray(data.user.identities) && data.user.identities.length === 0);

      if (jaExiste) {
        if (window.track) window.track("signup_existing", { plan: plan.id });
        setEstado("existe");
        return;
      }

      if (!res.ok) {
        setEstado("form");
        setErro(traduzErro(data.msg || data.message || data.error_description));
        return;
      }

      if (window.track) window.track("signup_success", { plan: plan.id });
      setEstado("ok");
      setTimeout(() => onDone(), 900);
    } catch (_) {
      setEstado("form");
      setErro("Sem conexão com o servidor. Verifique a internet e tente de novo.");
    }
  }

  return (
    <>
      <style>{`
        .su-head { margin-bottom: 22px; }
        .su-back {
          display: inline-flex; align-items: center; gap: 6px;
          background: none; border: 0; padding: 0; cursor: pointer;
          font-family: var(--font-mono, monospace); font-size: 11px;
          letter-spacing: .14em; text-transform: uppercase;
          color: var(--gold-700, #a67c2e);
        }
        .su-back:hover { text-decoration: underline; }
        .su-plan {
          display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
          flex-wrap: wrap; margin: 14px 0 0;
          border: 1px solid rgba(6,41,71,.12); border-radius: 14px;
          background: #fff; padding: 14px 16px;
        }
        .su-plan-name { font-family: var(--font-sans, sans-serif); font-weight: 600; font-size: 15px; color: var(--ipgs-deep, #062947); }
        .su-plan-price { font-family: var(--font-display, serif); font-size: 26px; line-height: 1; color: var(--ipgs-deep, #062947); }
        .su-form { display: grid; gap: 14px; margin-top: 20px; }
        @media (min-width: 640px) { .su-row-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; } }
        .su-field { display: grid; gap: 6px; }
        .su-label {
          font-family: var(--font-mono, monospace); font-size: 10.5px;
          letter-spacing: .14em; text-transform: uppercase; color: var(--deep-700, #3a5a76);
        }
        .su-input {
          width: 100%; box-sizing: border-box;
          border: 1px solid rgba(6,41,71,.16); border-radius: 12px;
          background: #fff; color: var(--ipgs-deep, #062947);
          font-family: var(--font-sans, sans-serif); font-size: 15px;
          padding: 13px 14px; outline: none;
          transition: border-color .15s, box-shadow .15s;
        }
        .su-input::placeholder { color: rgba(6,41,71,.38); }
        .su-input:focus { border-color: var(--ipgs-gold, #c69c50); box-shadow: 0 0 0 3px rgba(198,156,80,.18); }
        .su-hint { font-size: 11.5px; color: var(--deep-700, #3a5a76); }
        .su-erro {
          border: 1px solid rgba(176,58,46,.28); background: rgba(176,58,46,.07);
          color: #8f2f26; border-radius: 12px; padding: 11px 14px; font-size: 13.5px; line-height: 1.45;
        }
        .su-btn {
          width: 100%; cursor: pointer; margin-top: 4px;
          border: 1px solid var(--ipgs-deep, #062947); border-radius: 999px;
          background: var(--ipgs-deep, #062947); color: var(--ipgs-paper, #f1f1f1);
          font-family: var(--font-sans, sans-serif); font-weight: 600; font-size: 15px;
          padding: 15px 18px; transition: transform .15s, background .15s;
        }
        .su-btn:hover:not(:disabled) { transform: translateY(-1px); background: #04203a; }
        .su-btn:disabled { opacity: .55; cursor: progress; }
        .su-btn--ghost {
          background: #fff; color: var(--ipgs-deep, #062947);
        }
        .su-btn--ghost:hover:not(:disabled) { background: var(--paper-100, #e9e9e9); }
        .su-foot { margin: 16px 0 0; font-size: 12px; line-height: 1.55; color: var(--deep-700, #3a5a76); text-align: center; }
        .su-foot a { color: var(--ipgs-deep, #062947); font-weight: 600; }
        .su-ok { text-align: center; padding: 28px 0 12px; }
        .su-ok-mark {
          width: 54px; height: 54px; margin: 0 auto 16px; border-radius: 50%;
          display: grid; place-items: center; font-size: 26px;
          background: rgba(198,156,80,.16); color: var(--gold-700, #a67c2e);
        }
        .su-ok-title { font-family: var(--font-display, serif); font-size: 26px; color: var(--ipgs-deep, #062947); margin: 0 0 6px; }
      `}</style>

      {estado === "ok" ? (
        <div className="su-ok">
          <div className="su-ok-mark">✓</div>
          <h3 className="su-ok-title">Conta criada</h3>
          <p className="su-hint">Levando você para o pagamento…</p>
        </div>
      ) : (
        <>
          <div className="su-head">
            <button type="button" className="su-back" onClick={onBack}>← Trocar de plano</button>
            <div className="su-plan">
              <span className="su-plan-name">{plan.title}</span>
              <span className="su-plan-price">{plan.priceLabel}</span>
            </div>
          </div>

          <h3 className="ck-title" style={{ marginTop: 0 }}>Crie sua conta</h3>
          <p className="ck-sub">
            É nela que o teste é respondido e o laudo fica guardado. Leva menos de um minuto —
            o pagamento vem logo na sequência.
          </p>

          {estado === "existe" ? (
            <>
              <div className="su-erro" role="alert" ref={erroRef}>
                Esse e-mail já tem conta na plataforma. Pode seguir para o pagamento normalmente —
                depois é só entrar com a senha que você já usa.
              </div>
              <div className="su-form">
                <button type="button" className="su-btn" onClick={onDone}>
                  Seguir para o pagamento — {plan.priceLabel}
                </button>
                <button type="button" className="su-btn su-btn--ghost" onClick={() => setEstado("form")}>
                  Usar outro e-mail
                </button>
              </div>
            </>
          ) : (
            <form className="su-form" onSubmit={submit} noValidate>
              <div className="su-field">
                <label className="su-label" htmlFor="su-nome">Nome completo</label>
                <input id="su-nome" className="su-input" type="text" autoComplete="name"
                  placeholder="Quem vai fazer o teste" value={nome}
                  onChange={(e) => { setNome(e.target.value); setErro(""); }} />
              </div>

              <div className="su-row-2">
                <div className="su-field">
                  <label className="su-label" htmlFor="su-email">E-mail</label>
                  <input id="su-email" className="su-input" type="email" autoComplete="email"
                    inputMode="email" placeholder="seu@email.com" value={email}
                    onChange={(e) => { setEmail(e.target.value); setErro(""); }} />
                </div>
                <div className="su-field">
                  <label className="su-label" htmlFor="su-fone">WhatsApp</label>
                  <input id="su-fone" className="su-input" type="tel" autoComplete="tel"
                    inputMode="numeric" placeholder="(48) 99160-8052" value={fone}
                    onChange={(e) => { setFone(maskPhoneBR(e.target.value)); setErro(""); }} />
                </div>
              </div>

              <div className="su-field">
                <label className="su-label" htmlFor="su-senha">Senha</label>
                <input id="su-senha" className="su-input" type="password" autoComplete="new-password"
                  placeholder="Mínimo 8 caracteres" value={senha}
                  onChange={(e) => { setSenha(e.target.value); setErro(""); }} />
                <span className="su-hint">Você vai usar essa senha para entrar e ver o laudo.</span>
              </div>

              {erro ? <div className="su-erro" role="alert">{erro}</div> : null}

              <button className="su-btn" type="submit" disabled={estado === "enviando"}>
                {estado === "enviando" ? "Criando sua conta…" : `Criar conta e ir para o pagamento — ${plan.priceLabel}`}
              </button>
            </form>
          )}

          <p className="su-foot">
            Seus dados ficam salvos mesmo se você não concluir o pagamento agora.
            {sb.appUrl ? <> Já tem conta? <a href={`${sb.appUrl}/?page=auth`} target="_blank" rel="noopener">Entrar na plataforma</a>.</> : null}
          </p>
        </>
      )}
    </>
  );
}

window.SignupStep = SignupStep;
