const { useState, useMemo } = React;

function Sidebar({ pages, currentSlug, user, config, onNavigate, onSearch, onNewPage, onSettings, onLogin, onLogout }) {
  const [collapsed, setCollapsed] = useState({});

  const groups = useMemo(() => {
    const map = {};
    const root = [];
    for (const p of pages) {
      const parts = p.slug.split('/');
      if (parts.length === 1) {
        root.push(p);
      } else {
        const group = parts[0];
        if (!map[group]) map[group] = [];
        map[group].push(p);
      }
    }
    return { root, grouped: map };
  }, [pages]);

  function toggle(key) {
    setCollapsed(c => ({ ...c, [key]: !c[key] }));
  }

  const worldInitial = (config.worldName || 'W')[0].toUpperCase();

  return (
    <aside className="sidebar">
      <div className="sidebar-header">
        <a href="#/" className="sidebar-logo" onClick={() => onNavigate('#/')}>
          <div className="sidebar-logo-mark">{worldInitial}</div>
          <div className="sidebar-world-name">{config.worldName || 'My World'}</div>
        </a>
        <div className="sidebar-search-wrap">
          <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/></svg>
          <button className="sidebar-search" onClick={onSearch} style={{ background: 'none', border: '1px solid var(--border)', borderRadius: 'var(--radius)', width: '100%', height: '30px', paddingLeft: '28px', textAlign: 'left', fontSize: '13px', color: 'var(--text-muted)', cursor: 'pointer' }}>
            Search…
          </button>
        </div>
      </div>

      <nav className="sidebar-nav">
        {/* Home link */}
        <div className="nav-items">
          <a
            href="#/"
            className={'nav-item' + (currentSlug === '' || currentSlug === 'home' ? ' active' : '')}
            onClick={e => { e.preventDefault(); onNavigate('#/'); }}
          >
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
            Home
          </a>
        </div>

        {/* Root-level pages */}
        {groups.root.filter(p => p.slug !== 'home').map(p => (
          <div key={p.slug} className="nav-items">
            <a
              href={'#/wiki/' + p.slug}
              className={'nav-item' + (currentSlug === p.slug ? ' active' : '')}
              onClick={e => { e.preventDefault(); onNavigate('#/wiki/' + p.slug); }}
            >
              <span className="nav-item-dot"></span>
              {p.title}
            </a>
          </div>
        ))}

        {/* Grouped pages */}
        {Object.entries(groups.grouped).sort(([a],[b]) => a.localeCompare(b)).map(([group, items]) => (
          <div key={group} className="nav-section">
            <div
              className={'nav-section-header' + (collapsed[group] ? ' collapsed' : '')}
              onClick={() => toggle(group)}
            >
              <span>{group.replace(/-/g,' ').replace(/\b\w/g, c => c.toUpperCase())}</span>
              <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5"><path d="m6 9 6 6 6-6"/></svg>
            </div>
            {!collapsed[group] && (
              <div className="nav-items">
                {items.map(p => (
                  <a
                    key={p.slug}
                    href={'#/wiki/' + p.slug}
                    className={'nav-item' + (currentSlug === p.slug ? ' active' : '')}
                    onClick={e => { e.preventDefault(); onNavigate('#/wiki/' + p.slug); }}
                    title={p.title}
                  >
                    <span className="nav-item-dot"></span>
                    {p.title}
                  </a>
                ))}
              </div>
            )}
          </div>
        ))}

        {pages.length === 0 && (
          <div style={{ padding: '20px 16px', fontSize: '13px', color: 'var(--text-muted)', lineHeight: 1.6 }}>
            No pages yet.{user?.role === 'admin' ? ' Create your first page below.' : ''}
          </div>
        )}
      </nav>

      <div className="sidebar-footer">
        {user?.role === 'admin' && (
          <button className="sidebar-footer-btn accent" onClick={onNewPage}>
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
            New page
          </button>
        )}
        {user?.role === 'admin' && (
          <button className="sidebar-footer-btn" onClick={onSettings}>
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><circle cx="12" cy="12" r="3"/><path d="M19.07 4.93a1 1 0 0 0-1.41 0l-.71.71a7 7 0 0 0-9.9 9.9l-.71.71a1 1 0 0 0 1.41 1.41l.71-.71a7 7 0 0 0 9.9-9.9l.71-.71a1 1 0 0 0 0-1.41z"/></svg>
            Settings
          </button>
        )}
        {user ? (
          <button className="sidebar-footer-btn" onClick={onLogout}>
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/><polyline points="16 17 21 12 16 7"/><line x1="21" y1="12" x2="9" y2="12"/></svg>
            Sign out ({user.username})
          </button>
        ) : (
          <button className="sidebar-footer-btn" onClick={onLogin}>
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"/><polyline points="10 17 15 12 10 7"/><line x1="15" y1="12" x2="3" y2="12"/></svg>
            Admin sign in
          </button>
        )}
      </div>
    </aside>
  );
}

Object.assign(window, { Sidebar });
