import { useState, useRef, useCallback, useEffect } from "react";

interface UseTypingMessageResult {
  isTyping: boolean;
  typingText: string;
  startTyping: (text: string, onComplete: () => void) => void;
  stopTyping: () => void;
}

export const useTypingMessage = (): UseTypingMessageResult => {
  const [isTyping, setIsTyping] = useState(false);
  const [typingText, setTypingText] = useState("");
  const typingIntervalRef = useRef<NodeJS.Timeout | null>(null);
  const isMountedRef = useRef(true);

  useEffect(() => {
    isMountedRef.current = true;
    return () => {
      isMountedRef.current = false;
      if (typingIntervalRef.current) {
        clearInterval(typingIntervalRef.current);
      }
    };
  }, []);

  const stopTyping = useCallback(() => {
    if (typingIntervalRef.current) {
      clearInterval(typingIntervalRef.current);
      typingIntervalRef.current = null;
    }
    if (isMountedRef.current) {
      setIsTyping(false);
      setTypingText("");
    }
  }, []);

  const startTyping = useCallback((text: string, onComplete: () => void) => {
    // Stop any existing typing session first
    stopTyping();

    if (!isMountedRef.current) return;

    setIsTyping(true);
    setTypingText("");

    // اگر متن خالی باشد، فقط typing indicator را نمایش بده (برای loading)
    // و منتظر بمان تا onComplete صدا زده شود
    if (!text || text.length === 0) {
      // در این حالت، typing dots نمایش داده می‌شود
      // و باید بعداً با stopTyping یا startTyping دیگری متوقف شود
      return;
    }

    let index = 0;

    typingIntervalRef.current = setInterval(() => {
      if (!isMountedRef.current) {
        if (typingIntervalRef.current) {
          clearInterval(typingIntervalRef.current);
          typingIntervalRef.current = null;
        }
        return;
      }

      if (index < text.length) {
        setTypingText(text.substring(0, index + 1));
        index++;
      } else {
        if (typingIntervalRef.current) {
          clearInterval(typingIntervalRef.current);
          typingIntervalRef.current = null;
        }
        setIsTyping(false);
        setTypingText("");
        onComplete();
      }
    }, 30);
  }, [stopTyping]);

  return {
    isTyping,
    typingText,
    startTyping,
    stopTyping,
  };
};
