/* global React */
const { useState: useDetailState, useEffect: useDetailEffect } = React;

/* EU price format: 19.95 -> "19,95 €" */
const eur = (n) => Number(n).toFixed(2).replace(".", ",") + " €";

function StrainDetail({ strain, onClose, onAdd }) {
  const open = !!strain;
  const [pack, setPack] = useDetailState(2);
  const [zoom, setZoom] = useDetailState(false);

  // Reset pack selection to the best-value option whenever a new strain opens.
  useDetailEffect(() => { if (strain) setPack((strain.packs || []).findIndex(p => p.best) || 2); setZoom(false); }, [strain]);

  // Lock scroll + Esc to close.
  useDetailEffect(() => {
    if (!open) return;
    const prev = document.body.style.overflow;
    document.body.style.overflow = "hidden";
    const onKey = (e) => { if (e.key === "Escape") onClose(); };
    window.addEventListener("keydown", onKey);
    return () => { document.body.style.overflow = prev; window.removeEventListener("keydown", onKey); };
  }, [open, onClose]);

  const s = strain || {};
  const out = !!s.unavailable;          // not in stock — dash prices, grey add
  const packs = s.packs || [];
  const sel = packs[pack] || packs[0] || { price: s.price };

  // Portal to <body>: the hero section creates 3D/perspective stacking contexts,
  // so rendering in place lets later siblings (marquee, trays) paint OVER the
  // fixed modal. From document.body, z-index 400 genuinely wins.
  return ReactDOM.createPortal(
    <div className={`sd-root ${open ? "is-open" : ""}`} aria-hidden={!open}>
      <div className="sd-scrim" onClick={onClose} />

      <div className="sd-modal" role="dialog" aria-modal="true" aria-label={s.name ? `${s.name} genetics` : "Genetics"}>
        <button className="sd-close" aria-label="Close" onClick={onClose}>
          <svg width="20" height="20" viewBox="0 0 24 24" fill="none"><path d="M6 6l12 12M18 6L6 18" stroke="currentColor" strokeWidth="1.9" strokeLinecap="round" /></svg>
        </button>

        {open && (
        <div className="sd-grid">
          {/* LEFT — buy side */}
          <div className="sd-buy">
            <span className="eyebrow">{s.drop} · {s.name}</span>
            <h2 className="sd-name text-honey">{s.name}</h2>
            <p className="sd-lineage">{s.lineage}</p>

            <div className="sd-figure">
              <button type="button" className="sd-photo" onClick={() => setZoom(true)} aria-label="View full image">
                <img src={s.detailImg || s.img} alt={s.name} />
                {s.isNew && <span className="sd-new street">New</span>}
                <span className="sd-photo__zoom" aria-hidden="true">
                  <svg width="18" height="18" viewBox="0 0 24 24" fill="none"><circle cx="10.5" cy="10.5" r="6.5" stroke="currentColor" strokeWidth="1.9"/><path d="M15.5 15.5L21 21M10.5 7.5v6M7.5 10.5h6" stroke="currentColor" strokeWidth="1.9" strokeLinecap="round"/></svg>
                </span>
              </button>

              <div className="sd-stats">
                <div className="sd-stat"><span className="sd-stat__k">Gender</span><span className="sd-stat__v">{s.gender}</span></div>
                <div className="sd-stat"><span className="sd-stat__k">Flowering</span><span className="sd-stat__v">{s.flowering}</span></div>
                <div className="sd-stat"><span className="sd-stat__k">Yield</span><span className="sd-stat__v">{s.yield}</span></div>
                <div className="sd-stat"><span className="sd-stat__k">THC</span><span className="sd-stat__v">{s.thc}</span></div>
                <div className="sd-stat sd-stat--wide"><span className="sd-stat__k">Traits</span><span className="sd-stat__v">{s.traits}</span></div>
              </div>
            </div>

            <div className="sd-terps">
              <span className="sd-label">Terpene profile</span>
              <div className="sd-terps__row">
                {(s.terps || []).map(t => <span key={t} className="sd-terp">{t}</span>)}
              </div>
            </div>

            <div className="sd-packs">
              <span className="sd-label">Choose pack</span>
              <div className="sd-packs__grid">
                <div className="sd-packs__row">
                  {packs.map((p, i) => (
                    <button key={p.n} className={`sd-pack ${i === pack ? "is-sel" : ""}`} onClick={() => setPack(i)}>
                      {p.best && <span className="sd-pack__best street">Best value</span>}
                      <span className="sd-pack__n">{p.n}<small>seeds</small></span>
                      <span className="sd-pack__price">{out ? "-" : eur(p.price)}</span>
                      <span className="sd-pack__unit">{out ? "Currently unavailable" : `${eur(p.price / p.n)} / seed`}</span>
                    </button>
                  ))}
                </div>

                <div className="sd-buyrow">
                  <button className="sd-add" disabled={out} onClick={() => { onAdd && onAdd(s, 1, sel); onClose && onClose(); }}>
                    <svg width="18" height="18" viewBox="0 0 24 24" fill="none"><path d="M3 4h2l2.2 11.2a1.5 1.5 0 0 0 1.5 1.2h8.4a1.5 1.5 0 0 0 1.47-1.18L21 8H6" stroke="currentColor" strokeWidth="1.7" strokeLinecap="round" strokeLinejoin="round"/><circle cx="9.5" cy="20" r="1.4" fill="currentColor"/><circle cx="17.5" cy="20" r="1.4" fill="currentColor"/></svg>
                    Add to basket
                  </button>
                </div>
              </div>
            </div>
          </div>

          {/* RIGHT — about side */}
          <div className="sd-about">
            {(s.about || []).map((p, i) => <p key={i} className="sd-about__p">{p}</p>)}

            {s.family ? (
              <div className="sd-tree sd-tree--family">
                <span className="sd-label">Lineage</span>
                <div className="lt">
                  <div className="lt-cols">
                    {[s.family.parents[0], null, s.family.parents[1]].map((par, idx) =>
                      par === null
                        ? <span key="x" className="lt-x lt-x--main" aria-hidden="true">×</span>
                        : (
                          <div key={par.name} className="lt-branch">
                            <div className="lt-pair">
                              <span className="lt-chip">{par.kids[0]}</span>
                              <span className="lt-x" aria-hidden="true">×</span>
                              <span className="lt-chip">{par.kids[1]}</span>
                            </div>
                            <span className="lt-stem" aria-hidden="true"></span>
                            <div className="lt-parent">
                              <img className="lt-logo" src={par.logo} alt={par.bank} />
                              <span className="lt-parent__name">{par.name}</span>
                              <span className="lt-parent__bank">{par.bank}</span>
                            </div>
                          </div>
                        )
                    )}
                  </div>
                  <span className="lt-stem lt-stem--down" aria-hidden="true"></span>
                  <div className="lt-child">
                    <span className="lt-child__name street">{s.family.child}</span>
                    <span className="lt-child__sub">Satocrop · {s.drop}</span>
                  </div>
                </div>
              </div>
            ) : (
            <div className="sd-tree">
              <span className="sd-label">Lineage</span>
              <div className="sd-tree__parents">
                {(s.parents || []).map((par, i) => (
                  <div key={i} className={`sd-node sd-node--${i === 0 ? "l" : "r"}`}>
                    <span className="sd-node__chip" aria-hidden="true"><span className="sd-node__leaf" /></span>
                    <span className="sd-node__name">{par.name}</span>
                    <span className="sd-node__sub">{par.sub}</span>
                  </div>
                ))}
              </div>
              <svg className="sd-tree__svg" viewBox="0 0 300 70" preserveAspectRatio="none" aria-hidden="true">
                <path d="M40 4 C40 45, 150 30, 150 66" stroke="var(--border-strong)" strokeWidth="1.4" fill="none" />
                <path d="M260 4 C260 45, 150 30, 150 66" stroke="var(--border-strong)" strokeWidth="1.4" fill="none" />
                <circle cx="40" cy="4" r="3" fill="var(--gold-300)" />
                <circle cx="260" cy="4" r="3" fill="var(--gold-300)" />
              </svg>
              <div className="sd-child">
                <span className="sd-child__name street">{s.name}</span>
                <span className="sd-child__sub">Satocrop · {s.drop}</span>
              </div>
            </div>
            )}
          </div>
        </div>
        )}
      </div>

      {zoom && (
        <div className="sd-lightbox" onClick={() => setZoom(false)} role="dialog" aria-label={`${s.name} full image`}>
          <img src={s.detailImg || s.img} alt={s.name} />
          <button className="sd-lightbox__close" aria-label="Close image" onClick={() => setZoom(false)}>
            <svg width="22" height="22" viewBox="0 0 24 24" fill="none"><path d="M6 6l12 12M18 6L6 18" stroke="currentColor" strokeWidth="2" strokeLinecap="round"/></svg>
          </button>
        </div>
      )}
    </div>,
    document.body
  );
}

window.StrainDetail = StrainDetail;
