import { useEffect } from 'react';

import useClip from '@/hooks/useClip';
import { useContextSelector } from '@/hooks/useContextSelector';
import { EMPTY_UUID } from '@/utils/constants';

import CreateFormContext, {
  AddConditionType,
} from '../create/v2/CreateFormContext';
import {
  ConditionTypes,
  CreateModes,
  TimedCondition,
  TimedConditionTypes,
  VocalGenders,
} from '../create/v2/types';
import { useChatMessagesStore } from './stores';
import { useChatContext } from './useChat';

export const useLoadClipDataIntoState = () => {
  const { currentAssistantPrompt } = useChatMessagesStore();
  const { lastPlayedClipId } = useChatContext();
  const lastPlayedClip = useClip(lastPlayedClipId ?? '');
  const [_styles, setStyles] = useContextSelector(
    CreateFormContext,
    (context) => context.selectState([CreateModes.CUSTOM, 'styles'])
  );
  const [_title, setTitle] = useContextSelector(CreateFormContext, (context) =>
    context.selectState([CreateModes.CUSTOM, 'title'])
  );
  const [_lyrics, setLyrics] = useContextSelector(
    CreateFormContext,
    (context) => context.selectState([CreateModes.CUSTOM, 'lyrics'])
  );
  const [_excludeStyles, _setExcludeStyles] = useContextSelector(
    CreateFormContext,
    (context) =>
      context.selectState<string>([CreateModes.CUSTOM, 'excludeStyles'])
  );
  const [_weirdness, setWeirdness] = useContextSelector(
    CreateFormContext,
    (context) => context.selectState<number>([CreateModes.CUSTOM, 'weirdness'])
  );
  const [_styleInfluence, setStyleInfluence] = useContextSelector(
    CreateFormContext,
    (context) =>
      context.selectState<number>([CreateModes.CUSTOM, 'styleInfluence'])
  );
  const addCondition = useContextSelector(
    CreateFormContext,
    (context) => context.addCondition
  );
  const [_timedCondition, setTimedCondition] = useContextSelector(
    CreateFormContext,
    (context) => {
      return context.selectState<TimedCondition<TimedConditionTypes> | null>([
        'global',
        'timedCondition',
      ]);
    }
  );
  const [_audioInfluence, _setAudioInfluence] = useContextSelector(
    CreateFormContext,
    (context) =>
      context.selectState<number>([CreateModes.CUSTOM, 'audioInfluence'])
  );
  const [_vocalGender, setVocalGender] = useContextSelector(
    CreateFormContext,
    (context) =>
      context.selectState<VocalGenders>([CreateModes.CUSTOM, 'vocalGender'])
  );
  useEffect(() => {
    if (lastPlayedClip?.clip) {
      if (
        lastPlayedClip.clip?.metadata?.task === 'cover' &&
        lastPlayedClip.clip?.metadata?.cover_clip_id &&
        lastPlayedClip.clip.metadata.cover_clip_id !== EMPTY_UUID
      ) {
        addCondition(
          lastPlayedClip.clip.metadata.cover_clip_id,
          AddConditionType.COVER
        );
      } else if (
        lastPlayedClip.clip?.metadata?.task === 'extend' &&
        lastPlayedClip.clip.metadata?.edited_clip_id &&
        lastPlayedClip.clip.metadata?.edited_clip_id !== EMPTY_UUID
      ) {
        setTimedCondition({
          type: ConditionTypes.EXTEND,
          condition: {
            clipId: lastPlayedClip.clip.metadata?.edited_clip_id,
            startSeconds: lastPlayedClip.clip.metadata?.continue_at ?? 0,
          },
        });
      }

      // Add lyrics and styles last so they don't get overwritten by conditions
      requestAnimationFrame(() => {
        setLyrics(lastPlayedClip?.clip?.metadata?.prompt || '');
        setStyles(lastPlayedClip?.clip?.metadata?.tags || '');
        if (
          lastPlayedClip?.clip?.metadata?.control_sliders
            ?.weirdness_constraint !== undefined
        ) {
          setWeirdness(
            (lastPlayedClip?.clip?.metadata?.control_sliders
              ?.weirdness_constraint ?? 0) * 100.0
          );
        }
        if (
          lastPlayedClip?.clip?.metadata?.control_sliders?.style_weight !==
          undefined
        ) {
          setStyleInfluence(
            (lastPlayedClip?.clip?.metadata?.control_sliders?.style_weight ??
              0) * 100.0
          );
        }
      });
    } else if (currentAssistantPrompt) {
      if (
        currentAssistantPrompt.task === 'cover' &&
        currentAssistantPrompt.cover_clip_id
      ) {
        addCondition(
          currentAssistantPrompt.cover_clip_id,
          AddConditionType.COVER
        );
      } else if (
        currentAssistantPrompt.task === 'extend' &&
        currentAssistantPrompt.continue_clip_id
      ) {
        setTimedCondition({
          type: ConditionTypes.EXTEND,
          condition: {
            clipId: currentAssistantPrompt.continue_clip_id,
            startSeconds: currentAssistantPrompt.continue_at ?? 0,
          },
        });
      }
      requestAnimationFrame(() => {
        setTitle(currentAssistantPrompt?.title || '');
        setLyrics(currentAssistantPrompt?.lyrics || '');
        setStyles(currentAssistantPrompt?.tags || '');
        if (currentAssistantPrompt?.vocal_gender) {
          setVocalGender(currentAssistantPrompt?.vocal_gender);
        }
        if (currentAssistantPrompt?.weirdness_constraint !== undefined) {
          setWeirdness(currentAssistantPrompt?.weirdness_constraint * 100.0);
        }
        if (currentAssistantPrompt?.style_weight !== undefined) {
          setStyleInfluence(currentAssistantPrompt?.style_weight * 100.0);
        }
      });
    }
  }, [currentAssistantPrompt, lastPlayedClipId]);
};
