import { getCreatorList } from '@/services/creators';
import type { HomepageCollectionTextFields } from '@/services/homeCollections';

import { toNonEmptyString } from '@/utils/stringNormalization';

import type { CreatorListData } from '@/types/Creator';

import HomepageParallelPathsTeaserClient, {
  type HomepageParallelPathsTeaserCreatorOption,
} from './HomepageParallelPathsTeaserClient';

interface HomepageParallelPathsTeaserProps {
  locale: string;
  textFields?: HomepageCollectionTextFields | null;
}

const CREATOR_PAGE_SIZE = 1000;
const MAX_CREATOR_PAGES = 20;

const toCreatorOption = (
  creator: CreatorListData
): HomepageParallelPathsTeaserCreatorOption | null => {
  const id = toNonEmptyString(creator.alkotoAzonosito);
  const name = toNonEmptyString(creator.nev);

  if (!id || !name) {
    return null;
  }

  return {
    id,
    name,
    profession: toNonEmptyString(creator.szakma),
    avatarKey: toNonEmptyString(creator.profilkep?.key),
  };
};

const getAllCreators = async () => {
  const allCreators: CreatorListData[] = [];

  for (let page = 0; page < MAX_CREATOR_PAGES; page += 1) {
    const firstResult = page * CREATOR_PAGE_SIZE;
    const chunk = await getCreatorList({
      body: {
        firstResult,
        maxResults: CREATOR_PAGE_SIZE,
        onlyWithData: true,
      },
    });

    if (!chunk.length) break;
    allCreators.push(...chunk);
    if (chunk.length < CREATOR_PAGE_SIZE) break;
  }

  return allCreators;
};

const HomepageParallelPathsTeaser = async ({
  locale,
  textFields,
}: HomepageParallelPathsTeaserProps) => {
  const sortLocale = locale.startsWith('en') ? 'en' : 'hu';
  let creatorOptions: HomepageParallelPathsTeaserCreatorOption[] = [];

  try {
    const creators = await getAllCreators();
    const creatorsById = new Map<string, HomepageParallelPathsTeaserCreatorOption>();

    creators.forEach((creator) => {
      const option = toCreatorOption(creator);
      if (!option) return;
      if (creatorsById.has(option.id)) return;
      creatorsById.set(option.id, option);
    });

    creatorOptions = Array.from(creatorsById.values()).sort((left, right) =>
      left.name.localeCompare(right.name, sortLocale)
    );
  } catch (error) {
    console.error('Failed to preload creators for homepage parallel paths teaser:', error);
  }

  return (
    <HomepageParallelPathsTeaserClient creatorOptions={creatorOptions} textFields={textFields} />
  );
};

export default HomepageParallelPathsTeaser;
