import { useCallback } from 'react';

import { useStores } from '@/app/(root)/AppProviders';

const useRegenerateLyrics = () => {
  const { genForm } = useStores();
  const regenerate = useCallback(
    async ({
      prompt,
      prefix,
      edit,
      suffix,
      title,
    }: {
      prompt?: string;
      edit: string;
      prefix: string;
      suffix: string;
      title: string;
    }) => {
      const response = await genForm.apiClient.POST(
        '/api/generate/lyrics-infill/',
        {
          body: {
            prompt,
            context_lyrics_prefix: prefix,
            context_lyrics_edit: edit,
            context_lyrics_suffix: suffix,
            create_session_token: genForm.createSessionToken,
            title,
          },
        }
      );
      const replacedText = response.data?.generated_lyrics;

      if (!replacedText) {
        console.log(response);
        throw new Error('Failed to regenerate text');
      }

      let augmentedReplacedText = replacedText;

      if (
        replacedText.startsWith('[') &&
        !!prefix.trim() &&
        !prefix.endsWith('\n')
      ) {
        augmentedReplacedText = '\n' + augmentedReplacedText;
      }

      if (edit.endsWith('\n') && !augmentedReplacedText.endsWith('\n')) {
        augmentedReplacedText += '\n';
      }

      if (
        !edit &&
        !suffix.trim() &&
        !!prefix.trim() &&
        !augmentedReplacedText.startsWith('\n')
      ) {
        augmentedReplacedText = '\n' + augmentedReplacedText;
      }

      return {
        replacedText: augmentedReplacedText,
        fullText: prefix + augmentedReplacedText + suffix,
        lyricsRequestId: response.data!.lyrics_request_id,
        lyricsId: response.data!.lyrics_id,
      };
    },
    [genForm.apiClient]
  );

  return regenerate;
};

export default useRegenerateLyrics;
