import { useEffect, useRef } from 'react';

import { FocusedObjectContext } from '@/app/(root)/create/v2/useFocusedObject';
import { useContextSelector } from '@/hooks/useContextSelector';

import StudioContext from './StudioContext';
import {
  getFocusedStudioClip,
  getFocusedTrack,
  getSelectedClips,
  getSelectionDurationBeats,
} from './selectors';

export default function useFocusedObjectSync() {
  const setFocusedObject = useContextSelector(
    FocusedObjectContext,
    (ctx) => ctx.setFocusedObject
  );

  const focusedObject = useContextSelector(
    FocusedObjectContext,
    (ctx) => ctx.focusedObject
  );

  const setStudioPanelMode = useContextSelector(
    FocusedObjectContext,
    (ctx) => ctx.setStudioPanelMode
  );

  const selectionDurationBeats = useContextSelector(StudioContext, (ctx) =>
    getSelectionDurationBeats(ctx.state)
  );

  const focusedStudioClip = useContextSelector(StudioContext, (ctx) =>
    getFocusedStudioClip(ctx.state)
  );

  const focusedTrack = useContextSelector(StudioContext, (ctx) =>
    getFocusedTrack(ctx.state)
  );

  const selectedClips = useContextSelector(StudioContext, (ctx) =>
    getSelectedClips(ctx.state)
  );

  const focusedArea = useContextSelector(
    StudioContext,
    (ctx) => ctx.state.selection.focusedArea
  );

  // Track if we've initialized on first load
  const hasInitialized = useRef(false);

  // Minimal sync: handle initial load and clearing selections
  // All actual switching to studio mode is handled by explicit click handlers
  useEffect(() => {
    const hasStudioClipSelection =
      (focusedStudioClip &&
        focusedStudioClip.id &&
        focusedStudioClip.clipId &&
        selectedClips.length === 1) ||
      (selectedClips.length > 0 && selectionDurationBeats > 0);

    const hasStudioTrackSelection = focusedTrack?.id;

    const hasAnyStudioSelection =
      hasStudioClipSelection || hasStudioTrackSelection;

    const isShowingStudio = focusedObject?.type === 'studio';

    // On initial load: if we have selections and no focused object, initialize
    if (!hasInitialized.current && hasAnyStudioSelection && !focusedObject) {
      hasInitialized.current = true;
      setFocusedObject({ type: 'studio' });
      return;
    }

    // Mark as initialized after first render
    if (!hasInitialized.current) {
      hasInitialized.current = true;
    }

    // If no selections but showing studio, clear focused object
    if (!hasAnyStudioSelection && isShowingStudio) {
      setFocusedObject(undefined);
    }
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [
    focusedStudioClip?.id,
    focusedStudioClip?.clipId,
    focusedTrack?.id,
    focusedArea,
    selectedClips.length,
    selectionDurationBeats,
    setFocusedObject,
    setStudioPanelMode,
    focusedObject,
  ]);
}
