import { useMemo } from 'react';

import type {
  LookupServiceLinks,
  PrereleaseUpgradeError,
  PrereleaseUpgradeResponse,
} from '~/lib/songwhipApi/types';
import type { ServiceLinkOverrideCallback } from '~/src/features/presave';
import type { SelectedAlbum } from '~/src/store/albums/types';

import Box from '~/src/components/Box';
import PrimaryButton from '~/src/components/Button/PrimaryButton';
import { NotificationType } from '~/src/components/Notification';
import { PrereleaseIssues } from '~/src/features/presave';
import { useI18n } from '~/src/lib/i18n';
import localizeLinks from '~/src/lib/utils/resolveLinksForCountry/lib/localizeLinks';
import { FilteredPresaveDetails } from './FilteredPresaveDetails';

export const AddMissingLinksContent = ({
  album,
  preview: { campaignResult, errors },
  error,
  linksOverride,
  isUpdating,
  onUpdate,
  onLinksChange,
}: {
  album: SelectedAlbum;
  preview: PrereleaseUpgradeResponse;
  error?: PrereleaseUpgradeError;
  linksOverride?: LookupServiceLinks;
  isUpdating: boolean;
  onUpdate: () => void;
  onLinksChange: ServiceLinkOverrideCallback;
}) => {
  const { t } = useI18n('item');
  const allErrors = error?.data?.errors || errors;

  const hasAtLeastOneLink = useMemo(() => {
    if (!campaignResult) return false;

    const missingServices = album.missingServices || [];

    return missingServices.some((service) => {
      const linkOverride = linksOverride?.[service];
      const serviceData = campaignResult.services[service];

      // If explicitly set to null, it's invalid
      if (linkOverride === null) return false;

      // If override exists and is non-empty, it's valid
      if (linkOverride && linkOverride.trim() !== '') return true;

      // If no override, check if service has links in campaign result
      const links = serviceData?.links;
      if (links) {
        const localizedLink = localizeLinks({
          links: { [service]: links },
          forCountry: 'US',
          sourceCountry: 'US',
        });
        const link = localizedLink[service]?.link;
        if (link && link.trim() !== '') return true;
      }

      // No valid link
      return false;
    });
  }, [album.missingServices, linksOverride, campaignResult]);

  return (
    <Box flexColumn gap="3rem">
      <FilteredPresaveDetails
        campaignResult={campaignResult}
        missingServices={album.missingServices || []}
        linksOverride={linksOverride}
        errors={error?.data?.errors || errors}
        onLinkChange={onLinksChange}
      />

      {allErrors?.length > 0 && (
        <PrereleaseIssues
          title={t('failedToAddLinks')}
          type={NotificationType.ERROR}
          issues={allErrors}
        />
      )}

      <PrimaryButton
        width="100%"
        text={t('saveLinks')}
        height="4.5em"
        testId="saveLinksButton"
        isLoading={isUpdating}
        isDisabled={!hasAtLeastOneLink}
        onClick={() => {
          onUpdate();
        }}
      />
    </Box>
  );
};
