// Flows Carte partagés web + mobile — contenus SANS conteneur (le web les
// monte dans Dialog, le mobile dans BottomSheet). UX reprise du Figma
// « Oryze App UX/UI » (audit docs/audit-figma-oryze-app.md), redessinée en
// langage Oryze : commande de carte (finition + livraison + frais),
// changement de PIN (code de vérification → nouveau → confirmation),
// vérification de clôture, suivi de livraison. Mode démo assumé partout.
// window.OryzeShared.{NewCardFlow,PinChangeFlow,ClosureVerify,DeliveryInfoPanel}
(function () {
  const { Button, Amount, OtpInput, StatusTimeline, StatusBadge } = window.OryzeDesignSystem_78c60a;
  const Ic = window.OryzeIcons;
  const CardVisual = window.OryzeShared.CardVisual;

  const lbl = { fontFamily: "var(--font-mono)", fontSize: 10.5, letterSpacing: "0.08em", textTransform: "uppercase", color: "var(--text-muted)" };
  const helpTxt = { fontSize: 12, color: "var(--text-subtle)", lineHeight: 1.5 };
  const row = (k, v) => (
    <div style={{ display: "flex", justifyContent: "space-between", alignItems: "baseline", gap: 12 }}>
      <span style={{ fontSize: 13, color: "var(--text-muted)", whiteSpace: "nowrap" }}>{k}</span>
      <span style={{ fontSize: 13, fontWeight: 600, textAlign: "right", minWidth: 0 }}>{v}</span>
    </div>
  );
  const sunken = { display: "flex", flexDirection: "column", gap: 8, padding: "12px 14px", background: "var(--surface-sunken)", border: "var(--border-hair) solid var(--line-divider)", borderRadius: "var(--radius-md)" };

  function DoneTile({ title, children }) {
    return (
      <div style={{ display: "flex", flexDirection: "column", alignItems: "center", gap: 12, padding: "20px 0 10px", textAlign: "center" }}>
        <span style={{ width: 44, height: 44, display: "flex", alignItems: "center", justifyContent: "center", background: "var(--oryze-mint)", border: "var(--border-key) solid var(--line-keyline)", borderRadius: "var(--radius-md)", color: "var(--oryze-mint-ink)" }}>
          <Ic.check size={22} />
        </span>
        <div style={{ fontWeight: 700, fontSize: 18, letterSpacing: "-0.02em" }}>{title}</div>
        <div style={{ fontSize: 13, color: "var(--text-body)", lineHeight: 1.55, maxWidth: 340 }}>{children}</div>
      </div>
    );
  }

  /* ---------- Commande d'une nouvelle carte : finition → récap → commandée ---------- */

  function NewCardFlow({ onCancel, onDone }) {
    const K = window.OryzeCarte;
    const S = window.OryzeSeller;
    const [design, setDesign] = React.useState("majorelle");
    const [step, setStep] = React.useState("design"); // design | recap | done
    const [ordering, setOrdering] = React.useState(false);
    const designLabel = (K.designs.find((d) => d.value === design) || {}).label;
    const SWATCH = { majorelle: "var(--oryze-majorelle)", ink: "var(--oryze-ink)", lilac: "var(--oryze-lilac)" };

    if (step === "done") {
      return (
        <div style={{ display: "flex", flexDirection: "column", gap: 14 }}>
          <DoneTile title="Carte commandée">
            Finition {designLabel} — livraison estimée le {K.newCard.eta}. Suivi disponible depuis la vue Carte.
          </DoneTile>
          <div style={{ ...sunken, gap: 6 }}>
            {row("N° de suivi", <span style={{ fontFamily: "var(--font-mono)", fontSize: 12.5 }}>{K.delivery.tracking}</span>)}
            {row("Transporteur", K.delivery.courier)}
          </div>
          <Button size="md" variant="secondary" onClick={() => onDone && onDone(design)} style={{ alignSelf: "center" }}>Fermer</Button>
        </div>
      );
    }

    if (step === "recap") {
      return (
        <div style={{ display: "flex", flexDirection: "column", gap: 14 }}>
          <div style={sunken}>
            {row("Carte", "Physique · finition " + designLabel)}
            {row("Livraison", S.address)}
            {row("Délai estimé", K.newCard.delay + " · " + K.newCard.eta)}
          </div>
          <div style={{ display: "flex", flexDirection: "column", gap: 7, paddingTop: 10, borderTop: "var(--border-thin) solid var(--line-keyline)" }}>
            <div style={{ display: "flex", justifyContent: "space-between" }}><span style={{ fontSize: 13, color: "var(--text-muted)" }}>Carte physique</span><Amount cents={K.newCard.fee} size="sm" weight={500} /></div>
            <div style={{ display: "flex", justifyContent: "space-between", alignItems: "baseline" }}><span style={{ fontSize: 13, color: "var(--text-muted)" }}>Frais d'émission</span><span style={{ fontSize: 12.5, fontWeight: 600, color: "var(--fin-positive-text)" }}>Offerts</span></div>
            <div style={{ height: 1, background: "var(--line-keyline)", margin: "3px 0" }} />
            <div style={{ display: "flex", justifyContent: "space-between", alignItems: "baseline" }}><span style={{ fontWeight: 700, fontSize: 14 }}>Total</span><Amount cents={K.newCard.fee} size="lg" /></div>
          </div>
          <div style={helpTxt}>Débité du compte pro à l'expédition. Mode démo — aucune commande réelle.</div>
          <div style={{ display: "flex", gap: 8 }}>
            <Button variant="ghost" size="md" style={{ flex: 1 }} onClick={() => setStep("design")}>Retour</Button>
            <Button size="md" style={{ flex: 1 }} loading={ordering} iconLeft={<Ic.check size={15} />}
              onClick={() => { setOrdering(true); setTimeout(() => { setOrdering(false); setStep("done"); }, 900); }}>Commander</Button>
          </div>
        </div>
      );
    }

    return (
      <div style={{ display: "flex", flexDirection: "column", gap: 14 }}>
        <CardVisual design={design} style={{ maxWidth: "100%" }} />
        <div>
          <div style={{ ...lbl, marginBottom: 8 }}>Finition</div>
          <div style={{ display: "flex", gap: 10 }}>
            {K.designs.map((d) => (
              <button key={d.value} onClick={() => setDesign(d.value)} aria-label={"Finition " + d.label}
                style={{ display: "inline-flex", alignItems: "center", gap: 8, padding: "7px 12px", cursor: "pointer", fontFamily: "var(--font-sans)", fontSize: 12.5, fontWeight: 600, color: "var(--text-strong)", background: design === d.value ? "var(--surface-sunken)" : "var(--surface-card)", border: design === d.value ? "var(--border-key) solid var(--line-keyline)" : "var(--border-thin) solid var(--line-hairline)", borderRadius: 999, boxShadow: design === d.value ? "var(--shadow-xs)" : "none" }}>
                <span style={{ width: 16, height: 16, borderRadius: "50%", background: SWATCH[d.value], border: "1.5px solid var(--line-keyline)", flex: "none" }}></span>
                {d.label}
              </button>
            ))}
          </div>
        </div>
        <div style={sunken}>
          {row("Livraison", S.address)}
          {row("Délai estimé", K.newCard.delay)}
        </div>
        <div style={helpTxt}>Adresse du siège — modifiable dans Réglages d'entreprise.</div>
        <div style={{ display: "flex", gap: 8 }}>
          <Button variant="ghost" size="md" style={{ flex: 1 }} onClick={() => onCancel && onCancel()}>Annuler</Button>
          <Button size="md" style={{ flex: 1 }} onClick={() => setStep("recap")}>Continuer</Button>
        </div>
      </div>
    );
  }

  /* ---------- Changement de PIN : code de vérification → nouveau → confirmation ---------- */

  function PinChangeFlow({ onClose }) {
    const [step, setStep] = React.useState("verify"); // verify | new | confirm | done
    const [code, setCode] = React.useState("");
    const [pin1, setPin1] = React.useState("");
    const [pin2, setPin2] = React.useState("");
    const [err, setErr] = React.useState(null);
    const [left, setLeft] = React.useState(59);
    React.useEffect(() => {
      if (step !== "verify" || left <= 0) return;
      const t = setTimeout(() => setLeft((s) => s - 1), 1000);
      return () => clearTimeout(t);
    }, [step, left]);

    if (step === "done") {
      return (
        <div style={{ display: "flex", flexDirection: "column", gap: 14, alignItems: "center" }}>
          <DoneTile title="PIN modifié">
            Actif immédiatement pour paiements et retraits. Ne le communiquez jamais — on ne vous le demandera jamais.
          </DoneTile>
          <Button size="md" variant="secondary" onClick={() => onClose && onClose()}>Fermer</Button>
        </div>
      );
    }

    const STEPS = {
      verify: { title: "Vérification", sub: "Code envoyé au " + window.OryzeCarte.pinContact + " — saisissez-le pour continuer.", len: 6, mask: false, val: code, set: setCode },
      new: { title: "Nouveau PIN", sub: "4 chiffres. Évitez date de naissance et suites (1234).", len: 4, mask: true, val: pin1, set: setPin1 },
      confirm: { title: "Confirmez le PIN", sub: "Saisissez le même code une seconde fois.", len: 4, mask: true, val: pin2, set: setPin2 },
    };
    const s = STEPS[step];
    const stepIdx = step === "verify" ? 1 : step === "new" ? 2 : 3;

    function next(v) {
      setErr(null);
      if (step === "verify") { setStep("new"); }
      else if (step === "new") { setStep("confirm"); setPin2(""); }
      else {
        if (v !== pin1) { setErr("Les deux saisies ne correspondent pas."); setPin2(""); return; }
        setStep("done");
      }
    }

    return (
      <div style={{ display: "flex", flexDirection: "column", gap: 14 }}>
        <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", gap: 10 }}>
          <div style={{ fontWeight: 700, fontSize: 15 }}>{s.title}</div>
          <span style={{ fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--text-subtle)" }}>étape {stepIdx}/3</span>
        </div>
        <div style={{ fontSize: 13, color: "var(--text-body)", lineHeight: 1.5 }}>{s.sub}</div>
        <div style={{ display: "flex", justifyContent: "center" }}>
          <OtpInput key={step} length={s.len} mask={s.mask} autoFocus value={s.val} onChange={s.set} onComplete={next} />
        </div>
        {err && <div style={{ fontSize: 12.5, color: "var(--fin-negative)", fontWeight: 600, textAlign: "center" }}>{err}</div>}
        {step === "verify" && (
          <div style={{ display: "flex", flexDirection: "column", alignItems: "center", gap: 4, padding: "10px 0", borderTop: "var(--border-hair) solid var(--line-divider)" }}>
            <span style={{ fontSize: 12.5, color: "var(--text-muted)" }}>Code non reçu ?</span>
            {left > 0
              ? <span style={{ fontFamily: "var(--font-mono)", fontSize: 12.5, color: "var(--text-subtle)" }}>Renvoyer dans 0:{String(left).padStart(2, "0")}</span>
              : <Button size="sm" variant="ghost" onClick={() => setLeft(59)}>Renvoyer le code</Button>}
          </div>
        )}
        <div style={helpTxt}>Mode démo — n'importe quel code fonctionne.</div>
      </div>
    );
  }

  /* ---------- Vérification de clôture (opposition) ---------- */

  function ClosureVerify({ onVerified, onCancel }) {
    const [code, setCode] = React.useState("");
    return (
      <div style={{ display: "flex", flexDirection: "column", gap: 14 }}>
        <div style={{ fontSize: 13, color: "var(--text-body)", lineHeight: 1.55 }}>
          Dernière étape : saisissez le code envoyé au <span style={{ fontFamily: "var(--font-mono)" }}>{window.OryzeCarte.pinContact}</span> pour confirmer l'opposition — elle est définitive.
        </div>
        <div style={{ display: "flex", justifyContent: "center" }}>
          <OtpInput length={6} autoFocus value={code} onChange={setCode} onComplete={() => onVerified && onVerified()} />
        </div>
        <div style={helpTxt}>Mode démo — n'importe quel code fonctionne.</div>
        <Button variant="ghost" size="md" onClick={() => onCancel && onCancel()} style={{ alignSelf: "center" }}>Annuler</Button>
      </div>
    );
  }

  /* ---------- Suivi de livraison ---------- */

  function DeliveryInfoPanel() {
    const K = window.OryzeCarte;
    const S = window.OryzeSeller;
    return (
      <div style={{ display: "flex", flexDirection: "column", gap: 14 }}>
        <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", gap: 10 }}>
          <span style={lbl}>Carte {K.card.replacement}</span>
          <StatusBadge size="sm" status="sent" label="En livraison" />
        </div>
        <div style={sunken}>
          {row("Destinataire", S.name)}
          {row("Adresse", S.address)}
          {row("Transporteur", K.delivery.courier)}
          {row("N° de suivi", <span style={{ fontFamily: "var(--font-mono)", fontSize: 12.5 }}>{K.delivery.tracking}</span>)}
        </div>
        <StatusTimeline steps={K.delivery.steps} />
        <div style={helpTxt}>La carte arrive désactivée — activation à réception, plafonds et réglages repris automatiquement.</div>
      </div>
    );
  }

  window.OryzeShared = window.OryzeShared || {};
  Object.assign(window.OryzeShared, { NewCardFlow, PinChangeFlow, ClosureVerify, DeliveryInfoPanel });
})();
