import Debug from 'debug';

import type { SelectedPrerelease } from '~/src/store/prereleases/types';

import { PageTypes } from '~/lib/types';
import ItemPageEdit from '~/src/components/ItemPage/ItemPageEdit';
import ItemPageEditHeader from '~/src/components/ItemPage/ItemPageEdit/components/ItemPageEditHeader';
import useOnSave from '~/src/components/ItemPage/ItemPageEdit/useOnSave';
import { toCountdownFeatureItem } from '~/src/components/ItemPage/sections/CountdownSection/features';
import { toMerchFeatureItem } from '~/src/components/ItemPage/sections/MerchSection/features';
import { toPageTitleFeatureItem } from '~/src/components/ItemPage/sections/PageTitleSection';
import { toPresaveButtons2FeatureItem } from '~/src/components/ItemPage/sections/PresaveButtons2/features';
import { toShowsFeatureItem } from '~/src/components/ItemPage/sections/ShowsSection/features';
import { toVideosFeatureItem } from '~/src/components/ItemPage/sections/VideosSection/features';
import { PAGE_HEADER_HEIGHT } from '~/src/components/PageHeader';
import { useI18n } from '~/src/lib/i18n';
import { updatePrereleaseConfigAction } from '~/src/store/prereleases/actions/config';
import { useDispatch } from '~/src/store/redux';
import { PRERELEASE_EDIT_PAGE_SECTION_COMPONENTS } from '../constants';
import { usePrereleaseItemContext } from '../hooks';

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

export const EditPrereleasePageContent = ({
  stagedPrerelease,
  originalPrerelease,
}: {
  stagedPrerelease: SelectedPrerelease;
  originalPrerelease: SelectedPrerelease;
}) => {
  const i18n = useI18n();
  const dispatch = useDispatch();

  const originalItemContext = usePrereleaseItemContext({
    prerelease: originalPrerelease,
    withAllLinks: true,
  });

  const itemContext = usePrereleaseItemContext({
    prerelease: stagedPrerelease,
    withAllLinks: true,
    originalItemContext,
  });

  const { save } = useOnSave({
    itemContext,
    pagePath: stagedPrerelease.pagePath,

    onSave: async (config) => {
      debug('on save', config);

      await dispatch(
        updatePrereleaseConfigAction({
          id: originalPrerelease.id,
          data: config,
        })
      );

      // When the prerelease is a draft override the toast success text to use
      // 'saved' instead of 'published'. Using "published" might cause panic
      // if the page is sensitive and the owner believes it's private.
      if (originalPrerelease.isDraft) {
        return i18n.t('item.events.changesSaved');
      }
    },
  });

  return (
    <ItemPageEdit
      testId="editPrereleasePage"
      pageType={PageTypes.EDIT}
      key={originalPrerelease.id}
      itemContext={itemContext}
      hasContent={true}
      isLoading={false}
      userCanEdit={!!originalPrerelease.userCanEdit}
      pagePath={originalPrerelease.pagePath}
      sectionComponents={PRERELEASE_EDIT_PAGE_SECTION_COMPONENTS}
      header={{
        height: PAGE_HEADER_HEIGHT,
        content: (
          <ItemPageEditHeader
            pagePath={stagedPrerelease.pagePath}
            saveChanges={save}
          />
        ),
      }}
      getAddSectionItems={({ baseItems, itemContext }) => [
        // page specific sections
        toPresaveButtons2FeatureItem({ i18n, itemContext }),
        toCountdownFeatureItem({ i18n, itemContext }),

        // main sections
        toPageTitleFeatureItem({ i18n, itemContext }),

        // other sections
        toVideosFeatureItem({ i18n, itemContext }),
        toMerchFeatureItem({ i18n, itemContext }),
        toShowsFeatureItem({ i18n, itemContext }),

        ...baseItems,
      ]}
      trackerContext={{
        prereleaseId: originalPrerelease.id,
        prereleaseName: originalPrerelease.name,
        artistId: originalPrerelease.artistId,
        artistName: originalPrerelease.artistName,
      }}
    />
  );
};
