import {
  NavigationContainerRefContext,
  NavigationContext,
  NavigationProp,
} from '@react-native-bedrock/native/@react-navigation/native';
import { useContext } from 'react';

/**
 * @name useNavigationSafely
 * @category Hooks
 * @kind function
 * @link https://github.com/react-navigation/react-navigation/blob/d1cd940d9a3fb46bec0eb6bf4f8023789fc93b28/packages/core/src/useNavigation.tsx#L13
 * @description
 * `@react-navigation/native`에서 화면 간의 이동을 관리하는 [`useNavigation`](https://reactnavigation.org/docs/use-navigation/)을 안전하게 사용할 수 있도록 만든 Hook이에요.
 * 이 Hook은 `@react-navigation/native`에서 제공하는 `useNavigation`을 기반으로 만들어 졌지만, `navigation`이나 `root` 객체가 `null`이거나 `undefined`일 때 에러를 발생시키지 않아 보다 안전하게 동작해요.
 * 또, `@react-navigation/native`를 사용하지 않는 환경에서도 코드가 안전하게 동작하게 만들어 사용자가 에러를 경험하지 않아요.
 *
 * @returns {NavigationProp<ReactNavigation.RootParamList> | undefined} - 화면이 보이는 상태이에요.
 * @example
 * ```typescript
 *  const navigation = useNavigationSafely();
 *  const isNavigationFocused = () => navigation?.isFocused() ?? true;
 * ```
 */
export function useNavigationSafely(): NavigationProp<ReactNavigation.RootParamList> | undefined {
  const root = useContext(NavigationContainerRefContext);
  const navigation = useContext(NavigationContext);

  return (navigation ?? root ?? undefined) as NavigationProp<ReactNavigation.RootParamList> | undefined;
}
