import { useState } from 'react';
import { GoogleGenerativeAI } from '@google/generative-ai';

interface UseSemanticSearchProps {
    apiKey: string | null;
}

interface SearchSource {
    id: string;
    title: string;
    [key: string]: unknown;
}

export function useSemanticSearch({ apiKey }: UseSemanticSearchProps) {
    const [isSearching, setIsSearching] = useState(false);
    const [answer, setAnswer] = useState<string | null>(null);
    const [sources, setSources] = useState<SearchSource[]>([]);
    const [error, setError] = useState<string | null>(null);

    const performSearch = async (query: string) => {
        if (!apiKey || !query) return;

        setIsSearching(true);
        setError(null);
        setAnswer(null);
        setSources([]);

        try {
            // 1. Generate Query Embedding
            const genAI = new GoogleGenerativeAI(apiKey);
            const embeddingModel = genAI.getGenerativeModel({ model: "gemini-embedding-001" });
            const result = await embeddingModel.embedContent(query);
            const queryVector = result.embedding.values;

            // 2. Fetch Relevant Chunks from Backend (or Client)
            // Note: Since Firestore vector search is best handled server-side 
            // but we have BYOK, we pass the vector to a search API.
            const response = await fetch('/api/ai/search-wiki', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ queryVector, queryText: query, apiKey })
            });

            if (!response.ok) {
                const errData = await response.json();
                throw new Error(errData.error || 'Search failed');
            }

            const data = await response.json();
            setAnswer(data.answer);
            setSources(data.sources);

        } catch (err: unknown) {
            console.error('Semantic Search Error:', err);
            const message = err instanceof Error ? err.message : String(err);
            setError(message);
        } finally {
            setIsSearching(false);
        }
    };

    return { performSearch, isSearching, answer, sources, error };
}
