import { useState, useEffect } from 'react';
import { useContentIdsQuery } from '@/hooks/apiQueries/useContentIdsQuery';
import { useNDKContext } from '@/context/NDKContext';
import { parseEvent, parseCourseEvent } from '@/utils/nostr';

const AUTHOR_PUBKEY = process.env.NEXT_PUBLIC_AUTHOR_PUBKEY;

export const useContentSearch = () => {
    const [allContent, setAllContent] = useState([]);
    const [searchResults, setSearchResults] = useState([]);
    const { contentIds } = useContentIdsQuery();
    const { ndk } = useNDKContext();

    const fetchAllEvents = async (ids) => {
        try {
            await ndk.connect();
            const filter = {
                authors: [AUTHOR_PUBKEY],
                kinds: [30004, 30023, 30402],
                "#d": ids
            }
            const events = await ndk.fetchEvents(filter);

            const parsedEvents = new Set();
            events.forEach((event) => {
                let parsed;
                if (event.kind === 30004) {
                    parsed = parseCourseEvent(event);
                } else {
                    parsed = parseEvent(event);
                }
                parsedEvents.add(parsed);
            });
            setAllContent(parsedEvents);
        } catch (error) {
            console.log('error', error)
        }
    }

    useEffect(() => {
        if (contentIds) {
            fetchAllEvents(contentIds);
        }
    }, [contentIds]);

    const searchContent = (term) => {
        if (term.length > 2) {
            const filtered = Array.from(allContent).filter(content => {
                const searchableTitle = (content?.title || content?.name || '').toLowerCase();
                const searchableDescription = (content?.summary || content?.description || '').toLowerCase();
                const searchTerm = term.toLowerCase();

                return searchableTitle.includes(searchTerm) || searchableDescription.includes(searchTerm);
            });
            setSearchResults(filtered);
        } else {
            setSearchResults([]);
        }
    };

    return { searchContent, searchResults };
};