import { useCallback } from 'react';
import Debug from 'debug';

import type { LookupService } from '~/lib/songwhipLookup/types';
import type { ServiceTypes } from '~/lib/types';
import type { PresaveProviderProps } from '../types';

import getServiceDisplayData from '~/src/lib/getServiceDisplayData';
import { presavePrerelease } from '~/src/lib/songwhipApi/prereleases/presave';
import { useSelector } from '~/src/store/redux';
import {
  selectUserCountry,
  selectUserLanguage,
} from '~/src/store/session/selectors';

const debug = Debug('songwhip/useEmailPresave');

const useEmailPresave = ({
  item,
}: Omit<PresaveProviderProps, 'albumName' | 'onSuccess'>) => {
  const language = useSelector(selectUserLanguage);
  const country = useSelector(selectUserCountry);

  // in some cases we send this request in optimistic way
  // so we do not want to add any additional requests, like
  // songwhip event, in this function as it can be lost
  const performEmailPresave = useCallback(
    async ({
      approvalId,
      serviceType,
      email,
      isOptimistic,
    }: {
      approvalId?: string;
      serviceType: ServiceTypes;
      email: string;
      isOptimistic: boolean;
    }) => {
      const serviceName = getServiceDisplayData(serviceType)?.name;

      debug('submit', {
        email,
        serviceName,
        itemId: item.id,
      });

      try {
        await presavePrerelease({
          item,
          data: {
            type: 'email-notification',
            service: serviceType as LookupService,
            approvalId,
            userEmail: email,
            locale: language,
            country,
          },
        });
      } catch (error) {
        if (isOptimistic) return;
        throw error;
      }
    },
    [item]
  );

  return useCallback(
    async ({
      approvalId,
      email,
      serviceType,
      isOptimistic = false,
    }: {
      approvalId?: string;
      email: string;
      serviceType: ServiceTypes;
      isOptimistic?: boolean;
    }) => {
      await performEmailPresave({
        approvalId,
        email,
        serviceType,
        isOptimistic,
      });
    },
    []
  );
};

export default useEmailPresave;
