import type { InjectionKey, UnwrapRef } from 'vue';

import {
  readonly as defineReadonly,
  inject,
  provide,
  reactive,
  // defineComponent,
} from 'vue';

export interface CreateContextOptions {
  createProvider?: boolean;
  native?: boolean;
  readonly?: boolean;
}

type ShallowUnwrap<T> = {
  [P in keyof T]: UnwrapRef<T[P]>;
};

export function createContext<T>(context: any, key: InjectionKey<T> = Symbol('key'), options: CreateContextOptions = {}) {
  const { createProvider = false, native = false, readonly = true } = options;

  const state = reactive(context);
  const provideData = readonly ? defineReadonly(state) : state;
  !createProvider && provide(key, native ? context : provideData);

  return {
    state,
  };
}

export function useContext<T>(key: InjectionKey<T>, native?: boolean): T;

export function useContext<T>(key: InjectionKey<T> = Symbol('key'), defaultValue?: any): ShallowUnwrap<T> {
  return inject(key, defaultValue || {});
}
