import { useCallback } from 'react';

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

import useLogOnMount from './useLogOnMount';

// TODO: remove this hook, log in-line
const useLyricsABFlowTracking = () => {
  const { genForm } = useStores();

  const logGenerationInitiated = useCallback(
    (requestId: string, payload: { prompt: string; lyricsModel: string }) => {
      logWebUserEvent({
        actionName: 'LyricsCowriteModalLyricsGenerationInitiated',
        principalObjectType: 'lyrics_request',
        principalObjectValue: requestId,
        context: {
          prompt: payload.prompt,
          lyricsModel: payload.lyricsModel,
          generateInstanceToken: genForm.createSessionToken,
        },
      });
    },
    [genForm.createSessionToken, logWebUserEvent]
  );

  const logGenerationError = useCallback(
    (error: Error, payload: { prompt: string; lyricsModel: string }) => {
      logWebUserEvent({
        actionName: 'LyricsCowriteModalLyricsGenerationError',
        context: {
          prompt: payload.prompt,
          lyricsModel: payload.lyricsModel,
          error: error.message,
          generateInstanceToken: genForm.createSessionToken,
        },
      });
    },
    [genForm.createSessionToken, logWebUserEvent]
  );

  const logLyricsAccepted = useCallback(
    (requestId: string, lyricsId: string) => {
      logWebUserEvent({
        actionName: 'LyricsCowriteModalAcceptLyricsOptionClicked',
        context: {
          generateInstanceToken: genForm.createSessionToken,
          lyricsId: lyricsId,
          lyricsRequestId: requestId,
        },
      });
    },
    [genForm.createSessionToken, logWebUserEvent]
  );

  const logEscapeKey = useCallback(
    (requestId?: string) => {
      logWebUserEvent({
        actionName: 'LyricsCowriteModalEscapeKey',
        principalObjectType: 'lyrics_request',
        principalObjectValue: requestId,
        context: {
          generateInstanceToken: genForm.createSessionToken,
        },
      });
    },
    [genForm.createSessionToken, logWebUserEvent]
  );

  const logEnterKey = useCallback(() => {
    logWebUserEvent({
      actionName: 'LyricsCowriteModalEnterKey',
      context: {
        generateInstanceToken: genForm.createSessionToken,
      },
    });
  }, [genForm.createSessionToken, logWebUserEvent]);

  const logCancelButton = useCallback(
    (requestId?: string) => {
      logWebUserEvent({
        actionName: 'LyricsCowriteModalGenerateCancelButtonClicked',
        context: {
          generateInstanceToken: genForm.createSessionToken,
          lyricsRequestId: requestId,
        },
      });
    },
    [genForm.createSessionToken, logWebUserEvent]
  );

  const logModelSelectorClick = useCallback(
    (newLyricsModel: string) => {
      logWebUserEvent({
        actionName: 'LyricsCowriteModalLyricsModelSelectorClicked',
        context: {
          generateInstanceToken: genForm.createSessionToken,
          lyricsModel: newLyricsModel,
        },
      });
    },
    [genForm.createSessionToken, logWebUserEvent]
  );

  const logGenerateButtonClick = useCallback(
    (prompt: string, lyricsModel: string, requestId?: string) => {
      logWebUserEvent({
        actionName: 'LyricsCowriteModalGenerateButtonClicked',
        context: {
          prompt: prompt,
          lyricsModel: lyricsModel,
          lastLyricsRequestId: requestId,
          generateInstanceToken: genForm.createSessionToken,
        },
      });
    },
    [genForm.createSessionToken, logWebUserEvent]
  );

  const logMobileOptionTabClick = useCallback(
    (lyricsId: string) => {
      logWebUserEvent({
        actionName: 'LyricsCowriteModalMobileLyricsOptionTabClicked',
        context: {
          lyricsId,
          generateInstanceToken: genForm.createSessionToken,
        },
      });
    },
    [genForm.createSessionToken, logWebUserEvent]
  );

  const logLyricsModalClose = useCallback(
    (requestId?: string) => {
      logWebUserEvent({
        actionName: 'LyricsCowriteModalCloseButtonClicked',
        context: {
          generateInstanceToken: genForm.createSessionToken,
          lastLyricsRequestId: requestId,
        },
      });
    },
    [genForm.createSessionToken, logWebUserEvent]
  );

  return {
    logGenerationInitiated,
    logGenerationError,
    logLyricsAccepted,
    logEscapeKey,
    logEnterKey,
    logCancelButton,
    logModelSelectorClick,
    logGenerateButtonClick,
    logMobileOptionTabClick,
    logLyricsModalClose,
  };
};

export const useLogLyricsViewedOnMount = (
  lyricsId: string,
  requestId: string
) => {
  const { genForm } = useStores();
  useLogOnMount({
    actionName: 'LyricsCowriteModalViewedLyricsOption',
    principalObjectType: 'lyrics',
    principalObjectValue: lyricsId,
    context: {
      lyricsRequestId: requestId,
      generateInstanceToken: genForm.createSessionToken,
    },
  });
};

export default useLyricsABFlowTracking;
