import { RefObject, useCallback, useMemo, useState } from 'react';

import { Clip } from '@/state/clipStore';

import { getStudioClipsByTrackId } from './selectors';
import { StudioResolvedSelection } from './types';
import { StudioProjectState } from './types';

export default function useStudioStylesEditController(
  clipsById: Record<string, Clip>,
  stateRef: RefObject<StudioProjectState>,
  getEffectiveSelection: () => StudioResolvedSelection
) {
  const [styles, setStyles] = useState<string>('');
  const [excludeStyles, setExcludeStyles] = useState<string>('');

  const getCurrentSelectionStyles = useCallback(() => {
    const { focusedTrackId } = getEffectiveSelection();
    if (!focusedTrackId) return { styles: '', excludeStyles: '' };
    const clips =
      getStudioClipsByTrackId(stateRef.current)[focusedTrackId] || [];
    return (
      clips
        .filter((c) => c.clipId !== null)
        .map((c) => ({
          styles: clipsById[c.clipId]?.metadata.tags || '',
          excludeStyles: clipsById[c.clipId]?.metadata.negative_tags || '',
        }))
        .filter((c) => c.styles || c.excludeStyles)[0] || {
        styles: '',
        excludeStyles: '',
      }
    );
  }, [getEffectiveSelection, stateRef, clipsById]);

  return useMemo(
    () => ({
      getCurrentSelectionStyles,
      styles,
      excludeStyles,
      setStyles,
      setExcludeStyles,
    }),
    [
      getCurrentSelectionStyles,
      styles,
      excludeStyles,
      setStyles,
      setExcludeStyles,
    ]
  );
}
