import React, { useState, useRef } from 'react';
import { SilkeBox, SilkeText, SilkeIcon, SilkeIconDefinitions, SilkeSearchField, SilkeDivider } from '@vev/silke';

export const sentenceCase = (str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();

export const IconTile = ({ icon, copied, onCopy }) => (
  <div
    className="icon-tile"
    style={{
      display: 'flex',
      flexDirection: 'column',
      alignItems: 'center',
      width: 100,
      cursor: 'pointer',
      borderRadius: 'var(--border-radius-small)',
      padding: 8,
      background: copied === icon ? 'color-mix(in srgb, var(--color-success-50) 10%, transparent)' : undefined,
    }}
    onClick={() => onCopy(icon)}
  >
    <div style={{ height: 32, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
      <SilkeIcon icon={icon} style={{ fontSize: 20 }} />
    </div>
    <SilkeText size="xs" color="neutral-60" style={{ textAlign: 'center', wordBreak: 'break-all' }}>
      {icon}
    </SilkeText>
  </div>
);

export const IconGroup = ({ title, icons, copied, onCopy, defaultOpen = true }) => {
  const [open, setOpen] = useState(defaultOpen);

  return (
    <SilkeBox column gap="s">
      <SilkeBox
        gap="s"
        vAlign="center"
        onClick={() => setOpen(!open)}
        style={{ cursor: 'pointer', userSelect: 'none' }}
      >
        <SilkeIcon icon={open ? 'chevron.down' : 'chevron.right'} style={{ fontSize: 12 }} />
        <SilkeText size="l" weight="bold">{title}</SilkeText>
        <SilkeText size="s" color="neutral-40">{icons.length}</SilkeText>
      </SilkeBox>
      {open && (
        <SilkeBox gap="xs" wrap>
          {[...icons].sort().map((icon) => (
            <IconTile key={icon} icon={icon} copied={copied} onCopy={onCopy} />
          ))}
        </SilkeBox>
      )}
      <SilkeDivider />
    </SilkeBox>
  );
};

export const IconBrowser = () => {
  const [search, setSearch] = useState('');
  const [copied, setCopied] = useState(null);
  const timeoutRef = useRef(null);

  const allIcons = Object.keys(SilkeIconDefinitions);

  const handleCopy = (name) => {
    navigator.clipboard.writeText(name).then(() => {
      if (timeoutRef.current) clearTimeout(timeoutRef.current);
      setCopied(name);
      timeoutRef.current = setTimeout(() => setCopied(null), 1500);
    });
  };

  const filteredIcons = allIcons.filter((icon) =>
    icon.toLowerCase().includes(search.toLowerCase())
  );

  const groups = {};
  const ungrouped = [];

  filteredIcons.forEach((name) => {
    if (name.includes('.')) {
      const prefix = name.split('.')[0];
      if (!groups[prefix]) groups[prefix] = [];
      groups[prefix].push(name);
    } else {
      ungrouped.push(name);
    }
  });

  return (
    <SilkeBox column gap="l">
      <SilkeBox
        gap="s"
        vAlign="center"
        style={{ position: 'sticky', top: 16, zIndex: 1, paddingTop: 8, paddingBottom: 8 }}
        bg="neutral-0"
      >
        <SilkeBox flex>
          <SilkeSearchField
            placeholder="Search icons..."
            value={search}
            onChange={setSearch}
          />
        </SilkeBox>
        {copied ? (
          <SilkeText size="s" color="success-50" style={{ whiteSpace: 'nowrap' }}>
            Copied "{copied}"
          </SilkeText>
        ) : (
          <SilkeText size="s" color="neutral-40" style={{ whiteSpace: 'nowrap' }}>
            {filteredIcons.length} icons
          </SilkeText>
        )}
      </SilkeBox>

      {ungrouped.length > 0 && (
        <IconGroup
          title="Uncategorized"
          icons={ungrouped}
          copied={copied}
          onCopy={handleCopy}
        />
      )}

      {Object.entries(groups)
        .sort(([a], [b]) => a.localeCompare(b))
        .map(([prefix, icons]) => (
          <IconGroup
            key={prefix}
            title={sentenceCase(prefix)}
            icons={icons}
            copied={copied}
            onCopy={handleCopy}
          />
        ))}
    </SilkeBox>
  );
};

<style>{`.icon-tile:hover { outline: 1px solid var(--color-neutral-20); }`}</style>

# Icon Browser

<IconBrowser />
