import { NDKEvent } from '@nostr-dev-kit/ndk';
import { useQuery } from '@tanstack/react-query';

import { useNDK } from '@libs/ndk/provider';
import { useStorage } from '@libs/storage/provider';

import { parser } from '@utils/parser';
import { RichContent } from '@utils/types';

export function useEvent(id: string, embed?: string) {
  const { db } = useStorage();
  const { ndk } = useNDK();
  const { status, data, error } = useQuery(
    ['event', id],
    async () => {
      let richContent: RichContent;
      // return embed event (nostr.band api)
      if (embed) {
        const event: NDKEvent = JSON.parse(embed);
        if (event.kind === 1) richContent = parser(event);

        return { event: event, richContent: richContent };
      }

      // get event from db
      const dbEvent = await db.getEventByID(id);
      if (dbEvent) {
        if (dbEvent.kind === 1) richContent = parser(dbEvent);
        return { event: dbEvent, richContent: richContent };
      } else {
        // get event from relay if event in db not present
        const event = await ndk.fetchEvent(id);

        if (!event) throw new Error(`Event not found: ${id}`);
        if (event.kind === 1) {
          richContent = parser(event);
        }

        return { event: event, richContent: richContent };
      }
    },
    {
      enabled: !!ndk,
      staleTime: Infinity,
      refetchOnMount: false,
      refetchOnWindowFocus: false,
      refetchOnReconnect: false,
    }
  );

  return { status, data, error };
}
