import { format, isSameDay } from 'date-fns';

import { getFeaturedCreations } from '@/services/creations';
import { getEventsByDate } from '@/services/events';

import { toBudapestDate } from '@/utils/eventHelpers';

import { CreationListItem } from '@/types/Creation';
import { Event } from '@/types/Events';

import FeaturedSelectionClient from './FeaturedSelectionClient';

const toSafeBudapestDate = (isoString: string): Date => {
  try {
    const converted = toBudapestDate(isoString);
    return Number.isNaN(converted.getTime()) ? new Date(isoString) : converted;
  } catch {
    return new Date(isoString);
  }
};

const isMultiDayEvent = (event: Event): boolean => {
  if (!event.vege) return false;

  const start = toSafeBudapestDate(event.kezdete);
  const end = toSafeBudapestDate(event.vege);
  if (Number.isNaN(start.getTime()) || Number.isNaN(end.getTime())) return false;

  return !isSameDay(start, end);
};

export default async function FeaturedCreationsSection({ creatorId }: { creatorId: string }) {
  const featuredCreations = await getFeaturedCreations(creatorId, 16);
  const eventsResponse = await (async () => {
    const today = new Date();
    const oneYearLater = new Date();
    oneYearLater.setFullYear(today.getFullYear() + 1);

    const fromDate = format(today, 'yyyyMMdd');
    const toDate = format(oneYearLater, 'yyyyMMdd');

    const response = await getEventsByDate({
      fromDate,
      toDate,
      personId: creatorId,
      showMultiday: true,
    });

    if (!response) return [];

    return response;
  })();

  const events = [...eventsResponse]
    .filter((event) => !Number.isNaN(new Date(event.kezdete).getTime()))
    .sort((a, b) => {
      const aIsMultiDay = isMultiDayEvent(a);
      const bIsMultiDay = isMultiDayEvent(b);
      if (aIsMultiDay !== bIsMultiDay) {
        return aIsMultiDay ? 1 : -1;
      }

      return toSafeBudapestDate(a.kezdete).getTime() - toSafeBudapestDate(b.kezdete).getTime();
    }) as Event[];

  return (
    <FeaturedSelectionClient
      featuredCreations={featuredCreations as CreationListItem[]}
      creatorId={creatorId}
      events={events}
    />
  );
}
