import { useCallback } from 'react';

import { useContextSelector } from '@/hooks/useContextSelector';

import CreateFormContext from '../../v2/CreateFormContext';
import { CreateFormModals } from '../../v2/types';
import { CreateUploadModal } from './CreateUploadModal';
import { InspoModal } from './InspoModal';
import { OverwriteModal } from './OverwriteModal';
import { PersonasModal } from './PersonasModal';
import { PromptsType, SavedPromptsModal } from './SavedPromptsModal';

export const CreateModals = ({
  isStudioMode = false,
}: { isStudioMode?: boolean } = {}) => {
  const activeModal = useContextSelector(
    CreateFormContext,
    (context) => context.activeModal
  );
  const setActiveModal = useContextSelector(
    CreateFormContext,
    (context) => context.setActiveModal
  );

  // Check pending states to determine context for overwrite modals
  const pendingPersona = useContextSelector(
    CreateFormContext,
    (context) => context.pendingPersona
  );
  const pendingCondition = useContextSelector(
    CreateFormContext,
    (context) => context.pendingCondition
  );

  // Persona overwrite handlers (for styles)
  const handleOverwriteConfirm = useContextSelector(
    CreateFormContext,
    (context) => context.handleOverwriteConfirm
  );
  const handleOverwriteCancel = useContextSelector(
    CreateFormContext,
    (context) => context.handleOverwriteCancel
  );
  const handleOverwriteClose = useContextSelector(
    CreateFormContext,
    (context) => context.handleOverwriteClose
  );

  // Unified condition overwrite handlers (for cover, extend, etc.)
  const handleConditionOverwriteConfirm = useContextSelector(
    CreateFormContext,
    (context) => context.handleConditionOverwriteConfirm
  );
  const handleConditionOverwriteCancel = useContextSelector(
    CreateFormContext,
    (context) => context.handleConditionOverwriteCancel
  );
  const handleConditionOverwriteClose = useContextSelector(
    CreateFormContext,
    (context) => context.handleConditionOverwriteClose
  );

  const onClose = useCallback(() => setActiveModal(null), [setActiveModal]);

  if (!activeModal) {
    return null;
  }

  switch (activeModal) {
    case CreateFormModals.AudioRecord:
    case CreateFormModals.AudioUpload:
      return (
        <CreateUploadModal
          isOpen={true}
          onClose={onClose}
          isStudioMode={isStudioMode}
        />
      );
    case CreateFormModals.Personas:
      return <PersonasModal isOpen={true} onClose={onClose} />;
    case CreateFormModals.Inspo:
      return <InspoModal isOpen={true} onClose={onClose} />;
    case CreateFormModals.LyricsPrompts:
      return (
        <SavedPromptsModal
          isOpen={true}
          onClose={onClose}
          promptsType={PromptsType.Lyrics}
        />
      );
    case CreateFormModals.StylesPrompts:
      return (
        <SavedPromptsModal
          isOpen={true}
          onClose={onClose}
          promptsType={PromptsType.Styles}
        />
      );
    case CreateFormModals.OverwriteStyles: {
      // Determine which handlers and text to use based on pending state
      const isPersona = !!pendingPersona;
      const isCondition = !!pendingCondition;

      const handlers = isPersona
        ? {
            onClose: handleOverwriteClose,
            onConfirm: handleOverwriteConfirm,
            onCancel: handleOverwriteCancel,
          }
        : isCondition
          ? {
              onClose: handleConditionOverwriteClose,
              onConfirm: handleConditionOverwriteConfirm,
              onCancel: handleConditionOverwriteCancel,
            }
          : {
              // Fallback (shouldn't happen)
              onClose: handleOverwriteClose,
              onConfirm: handleOverwriteConfirm,
              onCancel: handleOverwriteCancel,
            };

      const bodyText = isPersona
        ? 'This Persona has styles. Do you want to overwrite your current styles?'
        : 'You already have styles. Do you want to overwrite your current styles?';

      return (
        <OverwriteModal
          isOpen={true}
          onClose={handlers.onClose}
          onConfirm={handlers.onConfirm}
          onCancel={handlers.onCancel}
          title='Overwrite Styles?'
          bodyText={bodyText}
          confirmButtonText='Overwrite'
          cancelButtonText='Keep Current'
        />
      );
    }
    case CreateFormModals.OverwriteLyrics:
      return (
        <OverwriteModal
          isOpen={true}
          onClose={handleConditionOverwriteClose}
          onConfirm={handleConditionOverwriteConfirm}
          onCancel={handleConditionOverwriteCancel}
          title='Overwrite Lyrics?'
          bodyText='This song has lyrics. Do you want to overwrite your current lyrics?'
          confirmButtonText='Overwrite'
          cancelButtonText='Keep Current'
        />
      );
    default:
      return null;
  }
};
