import { onMounted } from 'vue';
import type { ComponentInternalInstance } from 'vue';
import { runTryOnLifecycle } from '@/utils/lifecycle';
import type { VoidFunction } from '@robonen/stdlib';

export interface TryOnMountedOptions {
  sync?: boolean;
  target?: ComponentInternalInstance;
}

/**
 * @name tryOnMounted
 * @category Lifecycle
 * @description Call onMounted if it's inside a component lifecycle hook, otherwise just calls it
 *
 * @param {VoidFunction} fn The function to call
 * @param {TryOnMountedOptions} options The options to use
 * @param {boolean} [options.sync=true] If the function should be called synchronously
 * @param {ComponentInternalInstance} [options.target] The target instance to use
 * @returns {void}
 *
 * @example
 * tryOnMounted(() => console.log('Mounted!'));
 *
 * @example
 * tryOnMounted(() => console.log('Mounted!'), { sync: false });
 *
 * @since 0.0.1
 */
export function tryOnMounted(fn: VoidFunction, options: TryOnMountedOptions = {}) {
  runTryOnLifecycle(onMounted, fn, options);
}
