/**
 * 로딩 상태를 쉽게 사용할 수 있는 컴포저블
 * 로딩 카운터 방식으로 여러 비동기 작업을 안전하게 관리합니다.
 */
export const useLoading = () => {
  const loadingStore = useLoadingStore();

  /**
   * 로딩 상태와 함께 비동기 함수를 실행합니다.
   * 함수 실행 중에는 자동으로 로딩 카운터가 증가하고, 완료되면 감소합니다.
   *
   * @param asyncFn 실행할 비동기 함수
   * @param message 로딩 메시지 (선택사항)
   * @returns Promise<T> 비동기 함수의 결과
   */
  const withLoading = async <T>(
    asyncFn: () => Promise<T>,
    message?: string
  ): Promise<T> => {
    loadingStore.startLoading(message);
    try {
      return await asyncFn();
    } finally {
      loadingStore.stopLoading(message);
    }
  };

  /**
   * 로딩 상태를 수동으로 관리할 때 사용합니다.
   *
   * @param message 로딩 메시지 (선택사항)
   * @returns 로딩 종료 함수
   */
  const startLoading = (message?: string) => {
    loadingStore.startLoading(message);
    return () => loadingStore.stopLoading(message);
  };

  /**
   * 특정 메시지로 로딩을 시작하고, 해당 메시지로 종료할 수 있는 함수를 반환합니다.
   *
   * @param message 로딩 메시지
   * @returns 로딩 종료 함수
   */
  const withMessage = (message: string) => {
    loadingStore.startLoading(message);
    return () => loadingStore.stopLoading(message);
  };

  return {
    // 상태
    isLoading: computed(() => loadingStore.isLoading),
    loadingCount: computed(() => loadingStore.loadingCount),
    currentMessage: computed(() => loadingStore.currentMessage),
    loadingMessages: computed(() => loadingStore.loadingMessages),

    // 액션
    startLoading,
    stopLoading: loadingStore.stopLoading,
    withLoading,
    withMessage,
    clearAll: loadingStore.clearAllLoading,
    reset: loadingStore.reset,
  };
};
