import { useState, useEffect, useCallback, useRef } from 'react';
import { collection, query, getDocs, where, QuerySnapshot, DocumentData } from 'firebase/firestore';
import { db } from '@/lib/firebase';
import { COLLECTIONS } from '@/types/firestore';

export interface WikiEntry {
    id: string;
    title: string;
}

import { useAuth } from '@/contexts/AuthContext';

export function useWikiMap() {
    const { user } = useAuth();
    const [wikiMap, setWikiMap] = useState<Map<string, string>>(new Map());
    const [isLoading, setIsLoading] = useState(true);
    const isMounted = useRef(true); // Use a ref to track mount status

    const fetchWikiMap = useCallback(async () => {
        try {
            const newMap = new Map<string, string>();

            // 1. Fetch Public Documents (Visible to everyone)
            // [Root Fix] isDeleted == false 조건을 Firestore 쿼리에 넣으면
            // isDeleted 필드가 없는 문서(레거시 or 신규 생성 직후)가 전부 누락됨.
            // page.tsx와 동일하게 클라이언트 필터링으로 처리.
            const publicQuery = query(
                collection(db, COLLECTIONS.DOCUMENTS),
                where('visibility', '==', 'public')
            );

            // 2. Fetch My Documents (Private/Daily etc. visible to me)
            let myDocsPromise: Promise<QuerySnapshot<DocumentData> | null> = Promise.resolve(null);
            if (user) {
                const myQuery = query(
                    collection(db, COLLECTIONS.DOCUMENTS),
                    where('authorId', '==', user.uid)
                );
                myDocsPromise = getDocs(myQuery);
            }

            const [publicSnap, mySnap] = await Promise.all([
                getDocs(publicQuery),
                myDocsPromise as Promise<QuerySnapshot<DocumentData> | null>
            ]);

            if (isMounted.current) {
                // Process Public Docs (클라이언트에서 isDeleted 필터링)
                publicSnap.forEach((docSnap) => {
                    const data = docSnap.data();
                    if (data.isDeleted === true) return; // 삭제된 문서 제외
                    if (data.title) {
                        newMap.set(data.title.trim(), docSnap.id);
                    }
                });

                // Process My Docs (클라이언트에서 isDeleted 필터링)
                if (mySnap) {
                    mySnap.forEach((docSnap) => {
                        const data = docSnap.data();
                        if (data.isDeleted === true) return; // 삭제된 문서 제외
                        if (data.title) {
                            newMap.set(data.title.trim(), docSnap.id);
                        }
                    });
                }

                setWikiMap(newMap);
                setIsLoading(false);
            }
        } catch (error) {
            if (isMounted.current) {
                console.error('Error fetching WikiMap:', error);
                setIsLoading(false);
            }
        }
    }, [user]); // Re-fetch when user changes

    useEffect(() => {
        isMounted.current = true;
        fetchWikiMap();

        // [Optional] Poll every 5 minutes to keep map fresh for long sessions
        const intervalId = setInterval(() => {
            fetchWikiMap();
        }, 5 * 60 * 1000); // 5 minutes

        // [Fix] Listen for global 'wiki-updated' event to refresh map immediately after save
        const handleWikiUpdate = () => {
            fetchWikiMap();
        };
        window.addEventListener('wiki-updated', handleWikiUpdate);

        return () => {
            isMounted.current = false;
            clearInterval(intervalId);
            window.removeEventListener('wiki-updated', handleWikiUpdate);
        };
    }, [fetchWikiMap]);

    const refresh = () => {
        setIsLoading(true);
        fetchWikiMap();
    };

    return { wikiMap, isLoading, refresh };
}
