import { uniq } from 'lodash-es';
import { useCallback, useEffect, useRef } from 'react';
import { useLocalStorage } from 'usehooks-ts';

import { StudioProjectState } from './types';

export default function useUnheardTakeLanesController(
  state: StudioProjectState
) {
  const [unheardTakeLanes, setUnheardTakeLanes] = useLocalStorage<
    Record<string, boolean>
  >('heard-take-lanes-sept-16-2025', {});

  const addUnheardTakeLane = useCallback((takeLaneId: string) => {
    setUnheardTakeLanes((prev) => ({ ...prev, [takeLaneId]: true }));
  }, []);

  const markAsHeard = useCallback((takeLaneId: string) => {
    setUnheardTakeLanes((prev) => ({ ...prev, [takeLaneId]: false }));
  }, []);

  const unheardTakeLanesRef = useRef(unheardTakeLanes);
  useEffect(() => {
    unheardTakeLanesRef.current = unheardTakeLanes;
  }, [unheardTakeLanes]);

  useEffect(() => {
    const unheardTakeLanes = unheardTakeLanesRef.current;
    state.tracks.forEach((track) => {
      if (track.takeLanes.length === 0) {
        return;
      }
      if (!track.takeLanes.some((tl) => unheardTakeLanes[tl.id])) {
        return;
      }
      if (track.soloTakeLaneId && unheardTakeLanes[track.soloTakeLaneId]) {
        markAsHeard(track.soloTakeLaneId);
      }
      const clipIds = uniq(track.clips.map((c) => c.clipId));
      track.takeLanes.forEach((takeLane) => {
        if (
          takeLane.id &&
          unheardTakeLanes[takeLane.id] &&
          ((takeLane.clips.length === 0 &&
            takeLane.clipCreationIntents.length === 0) ||
            takeLane.clips.some((c) => clipIds.includes(c.clipId)))
        ) {
          markAsHeard(takeLane.id);
        }
      });
    });
  }, [state]);

  return { unheardTakeLanes, addUnheardTakeLane, markAsHeard };
}
