/* global React, L */
// ===========================================================
// 꾸미기 — 스킨 갤러리 미니 UI 프리뷰 (설명 문구 없음)
// ===========================================================

function SkinGalleryPreview({ skinId }) {
  if (skinId === "excel") return <SkinMiniSpreadsheet />;
  if (skinId === "notion") return <SkinMiniBw />;
  return <SkinMiniKawaii />;
}

function SkinMiniKawaii() {
  return (
    <div className="skin-mini skin-mini--default" aria-hidden="true">
      <div className="skin-mini-kawaii-chrome" />
      <div className="skin-mini-kawaii-main">
        <div className="skin-mini-kawaii-tabs">
          <span className="is-on" />
          <span />
          <span />
        </div>
        <div className="skin-mini-kawaii-list">
          <div className="skin-mini-kawaii-tape t-a" />
          <div className="skin-mini-kawaii-tape t-b" />
          <div className="skin-mini-kawaii-tape t-c is-pin" />
        </div>
      </div>
    </div>
  );
}

function SkinMiniBw() {
  return (
    <div className="skin-mini skin-mini--notion" aria-hidden="true">
      <div className="skin-mini-bw-chrome" />
      <div className="skin-mini-bw-body">
        <div className="skin-mini-bw-row">
          <span className="skin-mini-bw-chk" />
          <span className="skin-mini-bw-line w90" />
        </div>
        <div className="skin-mini-bw-row">
          <span className="skin-mini-bw-chk done" />
          <span className="skin-mini-bw-line w70" />
        </div>
        <div className="skin-mini-bw-row">
          <span className="skin-mini-bw-chk" />
          <span className="skin-mini-bw-line w55" />
        </div>
      </div>
    </div>
  );
}

function SkinMiniSpreadsheet() {
  return (
    <div className="skin-mini skin-mini--excel" aria-hidden="true">
      <div className="skin-mini-xl-ribbon" />
      <div className="skin-mini-xl-head">
        <span>#</span><span>✓</span><span className="grow" />
      </div>
      <div className="skin-mini-xl-row">
        <span>1</span><span className="skin-mini-xl-chk" /><span className="grow" />
      </div>
      <div className="skin-mini-xl-row alt">
        <span>2</span><span className="skin-mini-xl-chk done" /><span className="grow" />
      </div>
      <div className="skin-mini-xl-row">
        <span>3</span><span className="skin-mini-xl-chk" /><span className="grow" />
      </div>
    </div>
  );
}

function SkinGalleryCard({ skin, active, locked, onSelect }) {
  const [bouncing, setBouncing] = React.useState(false);
  const bounceEndRef = React.useRef(null);
  const wasActiveRef = React.useRef(active);

  const triggerBounce = React.useCallback(() => {
    if (bounceEndRef.current) clearTimeout(bounceEndRef.current);
    setBouncing(false);
    requestAnimationFrame(() => {
      setBouncing(true);
      bounceEndRef.current = setTimeout(() => setBouncing(false), 460);
    });
  }, []);

  React.useEffect(() => {
    if (active && !wasActiveRef.current) triggerBounce();
    wasActiveRef.current = active;
  }, [active, triggerBounce]);

  React.useEffect(() => () => {
    if (bounceEndRef.current) clearTimeout(bounceEndRef.current);
  }, []);

  const handleClick = () => {
    onSelect();
    if (!locked && active) triggerBounce();
  };

  return (
    <button
      type="button"
      className={
        "skin-gallery-card"
        + (active ? " is-active" : "")
        + (locked ? " is-locked" : "")
        + (bouncing ? " is-bouncing" : "")
      }
      onClick={handleClick}
    >
      <div className="skin-gallery-preview-wrap">
        <SkinGalleryPreview skinId={skin.id} />
        {locked ? (
          <span className="skin-gallery-lock">{L("skin.lockedBadge")}</span>
        ) : null}
      </div>
      <div className="skin-gallery-label">
        <span>{L(skin.nameKey)}</span>
        {locked && skin.price > 0 ? (
          <span className="skin-gallery-price">${skin.price}</span>
        ) : null}
      </div>
    </button>
  );
}

window.SkinGalleryPreview = SkinGalleryPreview;
window.SkinGalleryCard = SkinGalleryCard;
