import { useMemo, useState } from 'react';

import type { AmazonAuthResultSuccess } from '~/src/pages/api/amazon/auth/callback';
import type { PresaveProviderProps } from '../types';

import { assertEnvVar } from '~/lib/utils/assert';
import presaveLocales from '~/locales/fragments/presave';
import ErrorText from '~/src/components/ErrorText';
import { useAppAlert } from '~/src/components/NextApp/lib/CoreUi';
import { useAmazonMusicAuth } from '~/src/hooks/services';
import { useI18nStatic } from '~/src/lib/i18n';
import { useAppRouter } from '~/src/lib/router2';
import { presavePrerelease } from '~/src/lib/songwhipApi/prereleases/presave';
import { useSelector } from '~/src/store/redux';
import {
  selectUserCountry,
  selectUserLanguage,
} from '~/src/store/session/selectors';
import { AMAZON_AUTH_PAYLOAD_PARAM } from './constants';

export * from './constants';

const AMAZON_CLIENT_ID = assertEnvVar(
  process.env.NEXT_PUBLIC_AMAZON_CLIENT_ID,
  'NEXT_PUBLIC_AMAZON_CLIENT_ID'
);

const useAmazonMusicPresave = ({
  item,
  withNotificationEmail,

  onSuccess,
  onResult,
  onError,
}: PresaveProviderProps) => {
  const { t } = useI18nStatic<'presave'>(presaveLocales);

  const language = useSelector(selectUserLanguage);
  const country = useSelector(selectUserCountry);
  const appRouter = useAppRouter();
  const appAlert = useAppAlert();

  const fallbackAuthPayloadParam =
    appRouter.getAsQuery()[AMAZON_AUTH_PAYLOAD_PARAM];

  const isLoadingInitial = fallbackAuthPayloadParam ? true : false;
  const [isLoading, setIsLoading] = useState(isLoadingInitial);

  const handleAuthSuccess = async (payload: AmazonAuthResultSuccess) => {
    try {
      setIsLoading(true);
      onResult?.();

      await presavePrerelease({
        item,
        data: {
          type: 'presave',
          service: 'amazonMusic',
          serviceUserId: payload.userId,
          serviceUserToken: payload.accessToken,
          serviceUserRefreshToken: payload.refreshToken,
          serviceAppId: AMAZON_CLIENT_ID,
          userEmail: payload.email,
          locale: language,
          country: payload.country ?? country,
          withNotificationEmail,
        },
      });

      onSuccess(payload);
    } catch (error) {
      appAlert({
        content: <ErrorText error={error} />,
      });

      onError?.();
    } finally {
      setIsLoading(false);
    }
  };

  const startAmazonAuth = useAmazonMusicAuth({
    onSuccess: handleAuthSuccess,
    onError: () => {
      appAlert({ title: t('errors.AUTH_FAILED') });
    },
  });

  return useMemo(
    () => ({
      isLoading,
      start: startAmazonAuth,
    }),
    [isLoading]
  );
};

export default useAmazonMusicPresave;
