import { useRef, useState } from 'react';

import type { FormApi } from '~/src/components/Form';
import type { PrereleaseMetadataFormProps } from '~/src/components/PrereleaseMetadataForm';
import type { SelectedPrereleaseItem } from '~/src/store/types';

import { ItemTypes } from '~/lib/songwhipApi/types';
import Box from '~/src/components/Box';
import PrimaryButton from '~/src/components/Button/PrimaryButton';
import Notification, { NotificationType } from '~/src/components/Notification';
import { PrereleaseMetadataForm } from '~/src/components/PrereleaseMetadataForm';
import { useI18n } from '~/src/lib/i18n';
import { patchAlbumLookupConfig } from '~/src/store/albums/actions/lookupConfig';
import { patchAlbum } from '~/src/store/albums/actions/patch';
import { updatePrereleaseAction } from '~/src/store/prereleases/actions/update';
import { useDispatch } from '~/src/store/redux';

export const PrereleaseLookupError = ({
  prerelease,
  onRelease,
}: {
  prerelease: SelectedPrereleaseItem;
  onRelease(): void;
}) => {
  const [isLoading, setIsLoading] = useState(false);
  const { t } = useI18n();
  const formApiRef = useRef<FormApi>(null);
  const dispatch = useDispatch();

  const initialValues = getInitialMetadataValues(prerelease);

  const onSubmit: PrereleaseMetadataFormProps['onSubmit'] = async ({
    metadataChanges,
    lookupConfigChanges,
  }) => {
    try {
      setIsLoading(true);

      if (metadataChanges || lookupConfigChanges) {
        if (prerelease.type === ItemTypes.PRERELEASE) {
          await dispatch(
            updatePrereleaseAction({
              id: prerelease.id,
              data: {
                name: metadataChanges?.name,
                releaseDate: metadataChanges?.releaseDate,
                releaseTimezone: metadataChanges?.releaseTimezone,
                sourceUpc: lookupConfigChanges?.upc,
                sourceIsrc: lookupConfigChanges?.isrc,
                sourceUrl: lookupConfigChanges?.url,
                sourceLinks: lookupConfigChanges?.links,
              },
            })
          );
        } else {
          if (metadataChanges) {
            await dispatch(
              patchAlbum({
                albumId: prerelease.id,
                showToastOnError: false,
                changes: metadataChanges,
              })
            );
          }

          if (lookupConfigChanges) {
            await dispatch(
              patchAlbumLookupConfig({
                albumId: prerelease.id,
                showToastOnError: false,
                config: lookupConfigChanges,
              })
            );
          }
        }
      }

      onRelease();
    } finally {
      setIsLoading(false);
    }
  };

  return (
    <Box flexColumn gap="1.3rem">
      <Notification
        type={NotificationType.ERROR}
        content={t('upgradePrerelease.lookupFailed')}
      />
      <PrereleaseMetadataForm
        apiRef={formApiRef}
        isAdvancedSettingsEnabled={prerelease.type === ItemTypes.ALBUM}
        onSubmit={onSubmit}
        config={{
          albumName: { initialValue: initialValues.name, isDisabled: true },
          serviceLinks: { initialValue: initialValues.links },
          releaseDate: {
            initialValue: initialValues.releaseDate,
            errors: { empty: t('upgradePrerelease.missingReleaseDateError') },
            isDisabled: true,
          },
          upc: {
            initialValue: initialValues.upc,
            errors: { empty: t('upgradePrerelease.missingUpcAndIsrcError') },
            required: true,
          },
          isrc: {
            initialValue: initialValues.isrc,
            errors: { empty: t('upgradePrerelease.missingUpcAndIsrcError') },
            required: true,
          },
          url: {
            initialValue: initialValues.url,
            errors: { empty: t('upgradePrerelease.missingUpcAndIsrcError') },
            required: true,
          },
        }}
      />
      <PrimaryButton
        width="100%"
        text={t('item.actions.upgradePrerelease')}
        height="4.5em"
        margin="3rem 0 0"
        isLoading={isLoading}
        onClick={() => {
          formApiRef.current?.submit();
        }}
      />
    </Box>
  );
};

const getInitialMetadataValues = (prerelease: SelectedPrereleaseItem) => {
  if (prerelease.type === ItemTypes.ALBUM) {
    return {
      name: prerelease.name,
      releaseDate: prerelease.releaseDate,
      upc: prerelease.lookupConfig?.upc ?? prerelease.upc,
      isrc: prerelease.lookupConfig?.isrc,
      url: prerelease.lookupConfig?.url,
      links: prerelease.lookupConfig?.links,
    };
  }

  return {
    name: prerelease.name,
    releaseDate: prerelease.releaseDate,
    releaseTimezone: prerelease.releaseTimezone,
    upc: prerelease.sourceUpc,
    isrc: prerelease.sourceIsrc,
    url: prerelease.sourceUrl,
    links: prerelease.sourceLinks,
  };
};
