import { inject, readonly, ref } from "vue";

import type { Ref, InjectionKey } from "vue";

interface LoaderOverlay {
  isLoading: Readonly<Ref<boolean, boolean>>;
  loaderOverlayOn: () => void;
  loaderOverlayOff: () => void;
}

export const LoaderOverlaySymbol: InjectionKey<LoaderOverlay> =
  Symbol.for("vueless:loader-overlay");

const isLoading = ref(true);

function loaderOverlayOn(): void {
  isLoading.value = true;
}

function loaderOverlayOff(): void {
  isLoading.value = false;
}

export function createLoaderOverlay(): LoaderOverlay {
  return {
    isLoading: readonly(isLoading),
    loaderOverlayOn,
    loaderOverlayOff,
  };
}

export function useLoaderOverlay(): LoaderOverlay {
  const loaderOverlay = inject(LoaderOverlaySymbol);

  if (!loaderOverlay) {
    throw new Error(
      "[vueless] LoaderOverlay not provided. Ensure you are using `provide` with `LoaderOverlaySymbol`.",
    );
  }

  return loaderOverlay;
}
