import { useGateValue } from '@statsig/react-bindings';
import { useCallback, useMemo, useState } from 'react';

import { useStores } from '@/app/(root)/AppProviders';
import { ModalTypes } from '@/components/modal/constants/ModalTypes';
import logWebUserEvent from '@/logging/logWebUserEvent';
import { Clip } from '@/state/clipStore';
import { FeatureKey } from '@/state/sessionStore';
import { isSubscriber } from '@/utils/session';

export type PreviewClipType = 'preview' | 'lockedPreview' | undefined;

export interface UseClipPreviewUpsellResult {
  previewClipType: PreviewClipType;
  previewUnlocking: boolean;
  manualUnlock: boolean;
  enableManualUnlock: boolean;
  isUnlocking: boolean;
  handleToggle: (e: React.MouseEvent) => void;
  handleUnlockPreview: (e: React.MouseEvent) => Promise<void>;
}

// Custom hook to handle preview clip upsell logic across different clip row components
export function useClipPreviewUpsell(
  clip: Clip | null
): UseClipPreviewUpsellResult {
  const { clips, menus, session } = useStores();
  const [isUnlocking, setIsUnlocking] = useState(false);

  // Determine preview type based on preview_seconds
  const previewClipType: PreviewClipType = useMemo(() => {
    if (!clip) return undefined;
    return clip.preview_seconds == null
      ? undefined
      : clip.preview_seconds === 0
        ? 'lockedPreview'
        : 'preview';
  }, [clip]);

  // Check if preview is being unlocked (for subscribers)
  const previewUnlocking = useMemo(() => {
    return Boolean(clip?.metadata.type === 'preview' && isSubscriber(session));
  }, [clip?.metadata.type, session]);

  // Check if manual unlock is available
  const manualUnlock = useMemo(() => {
    return Boolean(clips.shouldShowManualUnlock(clip?.id || ''));
  }, [clips, clip?.id]);

  const enableManualUnlock = useGateValue('manual-unlock') ?? false;

  // Handler for upgrade button click that opens upsell modal
  const handleToggle = useCallback(
    (e: React.MouseEvent) => {
      if (!clip || clip.preview_seconds == null) return;
      menus.setCurrentUpsellFeature(FeatureKey.UPGRADE_LATEST_MODEL);
      e.stopPropagation();
      e.preventDefault();
      logWebUserEvent({
        actionName: 'UpgradeClipPreviewClicked',
        principalObjectType: 'song',
        principalObjectValue: clip.id,
        context: {
          songId: clip.id,
          previewSeconds: clip.preview_seconds,
        },
      });
      menus.openModal(ModalTypes.UPSELL_MODAL);
    },
    [clip, menus]
  );

  // Handler for unlock preview button click
  const handleUnlockPreview = useCallback(
    async (e: React.MouseEvent) => {
      if (!clip || isUnlocking) return;

      const currentClip = clips.clipById[clip.id];
      if (currentClip?.metadata.type === 'gen') return;

      e.stopPropagation();
      e.preventDefault();

      try {
        setIsUnlocking(true);
        await clips.unlockPreview(clip.id);
        clips.addToPreviewPollingQueue(clip.id);
      } catch (error) {
        console.error('Failed to unlock preview:', error);
      } finally {
        setIsUnlocking(false);
      }
    },
    [clip, clips, isUnlocking]
  );

  return {
    previewClipType,
    previewUnlocking,
    manualUnlock,
    enableManualUnlock,
    isUnlocking,
    handleToggle,
    handleUnlockPreview,
  };
}
