/* Theme manager — light/dark with localStorage + prefers-color-scheme.
   Applies as data-theme on <html>; colors_and_type.css does the flip. */

const ThemeCtx = React.createContext({ theme: 'light', setTheme: () => {}, toggle: () => {} });

function getInitialTheme() {
  try {
    const stored = localStorage.getItem('vizo-theme');
    if (stored === 'light' || stored === 'dark') return stored;
  } catch (e) {}
  if (typeof window !== 'undefined' && window.matchMedia &&
      window.matchMedia('(prefers-color-scheme: dark)').matches) {
    return 'dark';
  }
  return 'light';
}

function ThemeProvider({ children }) {
  const [theme, setThemeState] = React.useState(getInitialTheme);

  React.useEffect(() => {
    document.documentElement.setAttribute('data-theme', theme);
    try { localStorage.setItem('vizo-theme', theme); } catch (e) {}
  }, [theme]);

  // Respect OS changes if user hasn't explicitly picked
  React.useEffect(() => {
    if (!window.matchMedia) return;
    const mq = window.matchMedia('(prefers-color-scheme: dark)');
    const onChange = (e) => {
      let stored = null;
      try { stored = localStorage.getItem('vizo-theme'); } catch (err) {}
      if (stored !== 'light' && stored !== 'dark') {
        setThemeState(e.matches ? 'dark' : 'light');
      }
    };
    mq.addEventListener ? mq.addEventListener('change', onChange) : mq.addListener(onChange);
    return () => {
      mq.removeEventListener ? mq.removeEventListener('change', onChange) : mq.removeListener(onChange);
    };
  }, []);

  const setTheme = React.useCallback((t) => setThemeState(t), []);
  const toggle = React.useCallback(() => setThemeState(t => t === 'dark' ? 'light' : 'dark'), []);

  return (
    <ThemeCtx.Provider value={{ theme, setTheme, toggle }}>{children}</ThemeCtx.Provider>
  );
}

function useTheme() { return React.useContext(ThemeCtx); }

/* Icon-only toggle — sun ↔ moon, smooth crossfade.
   Matches nav text colour + weight; subtle bone-tint on hover. */
function ThemeToggle({ size = 22 }) {
  const { theme, toggle } = useTheme();
  const [hover, setHover] = React.useState(false);
  const isDark = theme === 'dark';
  return (
    <button
      type="button"
      onClick={toggle}
      onMouseEnter={() => setHover(true)}
      onMouseLeave={() => setHover(false)}
      aria-label={isDark ? 'Switch to light mode' : 'Switch to dark mode'}
      aria-pressed={isDark}
      title={isDark ? 'Light mode' : 'Dark mode'}
      style={{
        width: 36, height: 36, borderRadius: 999,
        display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
        background: hover ? 'var(--bone)' : 'transparent',
        color: hover ? 'var(--ink)' : 'var(--graphite)',
        border: 'none', cursor: 'pointer', padding: 0,
        transition: 'background-color 200ms var(--ease-standard), color 200ms var(--ease-standard)',
        position: 'relative',
      }}
    >
      {/* Crossfade between sun + moon */}
      <span style={iconWrap(isDark ? 0 : 1, isDark ? -90 : 0)}>
        <Sun size={size} />
      </span>
      <span style={iconWrap(isDark ? 1 : 0, isDark ? 0 : 90)}>
        <Moon size={size} />
      </span>
    </button>
  );
}

function iconWrap(opacity, rotate) {
  return {
    position: 'absolute',
    display: 'inline-flex',
    alignItems: 'center', justifyContent: 'center',
    opacity, transform: `rotate(${rotate}deg)`,
    transition: 'opacity 250ms var(--ease-standard), transform 300ms var(--ease-standard)',
  };
}

function Sun({ size = 22 }) {
  return (
    <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round">
      <circle cx="12" cy="12" r="4" />
      <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41" />
    </svg>
  );
}
function Moon({ size = 22 }) {
  return (
    <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round">
      <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" />
    </svg>
  );
}

Object.assign(window, { ThemeProvider, useTheme, ThemeToggle, ThemeCtx });
