'use client';

import { useState, useEffect, useRef } from 'react';
import {
  collection,
  query,
  orderBy,
  limit,
  onSnapshot,
  doc,
} from 'firebase/firestore';
import { db } from '@/lib/firebase';
import type { DocumentStatus, Review } from '@/types/firestore';
import type { Timestamp } from 'firebase/firestore';

export interface DocumentReviewState {
  status: DocumentStatus | null;
  reviews: Review[];
  loading: boolean;
  error: Error | null;
}

export function useDocumentReviewListener(docId: string | null): DocumentReviewState {
  const [status, setStatus] = useState<DocumentStatus | null>(null);
  const [reviews, setReviews] = useState<Review[]>([]);
  const [loading, setLoading] = useState<boolean>(false);
  const [error, setError] = useState<Error | null>(null);

  const unsubscribeDocRef = useRef<(() => void) | null>(null);
  const unsubscribeReviewsRef = useRef<(() => void) | null>(null);

  useEffect(() => {
    if (!docId) return;

    const connect = () => {
      // 기존 리스너 정리
      if (unsubscribeDocRef.current) {
        unsubscribeDocRef.current();
        unsubscribeDocRef.current = null;
      }
      if (unsubscribeReviewsRef.current) {
        unsubscribeReviewsRef.current();
        unsubscribeReviewsRef.current = null;
      }

      setLoading(true);

      // 1. documents/{docId} 문서 리스너
      const docRef = doc(db, 'documents', docId);
      const unsubDoc = onSnapshot(
        docRef,
        (snapshot) => {
          if (snapshot.exists()) {
            const data = snapshot.data();
            setStatus(data.status as DocumentStatus);
          } else {
            setStatus(null);
          }
          setLoading(false);
        },
        (err) => {
          setError(err);
          setLoading(false);
        }
      );
      unsubscribeDocRef.current = unsubDoc;

      // 2. documents/{docId}/reviews 서브컬렉션 리스너 (최신순 10개)
      const reviewsQuery = query(
        collection(docRef, 'reviews'),
        orderBy('createdAt', 'desc'),
        limit(10)
      );

      const unsubReviews = onSnapshot(
        reviewsQuery,
        (snapshot) => {
          const reviewList: Review[] = snapshot.docs.map((reviewSnap) => {
            const data = reviewSnap.data();
            return {
              id: reviewSnap.id,
              docId: data.docId as string,
              reviewerId: data.reviewerId as string,
              reviewerName: data.reviewerName as string,
              decision: data.decision as Review['decision'],
              comment: data.comment as string,
              riskLevel: data.riskLevel as Review['riskLevel'],
              createdAt: data.createdAt as Timestamp,
            };
          });
          setReviews(reviewList);
          setLoading(false);
        },
        (err) => {
          setError(err);
          setLoading(false);
        }
      );
      unsubscribeReviewsRef.current = unsubReviews;
    };

    const disconnect = () => {
      if (unsubscribeDocRef.current) {
        unsubscribeDocRef.current();
        unsubscribeDocRef.current = null;
      }
      if (unsubscribeReviewsRef.current) {
        unsubscribeReviewsRef.current();
        unsubscribeReviewsRef.current = null;
      }
    };

    // visibilitychange 핸들러
    const handleVisibilityChange = () => {
      if (document.visibilityState === 'hidden') {
        disconnect();
      } else {
        connect();
      }
    };

    // iOS Safari 폴백: pagehide/pageshow
    const handlePageHide = () => {
      disconnect();
    };

    const handlePageShow = () => {
      connect();
    };

    document.addEventListener('visibilitychange', handleVisibilityChange);
    document.addEventListener('pagehide', handlePageHide);
    document.addEventListener('pageshow', handlePageShow);

    // 초기 연결
    connect();

    return () => {
      disconnect();
      document.removeEventListener('visibilitychange', handleVisibilityChange);
      document.removeEventListener('pagehide', handlePageHide);
      document.removeEventListener('pageshow', handlePageShow);
    };
  }, [docId]);

  return { status, reviews, loading, error };
}
