/** IoC 作用域 */
export type ScopeValue = 'singleton' | 'request' | 'prototype'

/** 可 new 的 Provider 类 */
export type ClassToken<T = unknown> = abstract new (...args: any[]) => T

/**
 * 注入标识：类 / 字符串 id / symbol
 * 字符串 id 用于跨模块按名注入
 */
export type InjectionToken<T = unknown> = ClassToken<T> | string | symbol

export type InjectMeta = {
  propertyKey: string | symbol
  /** 依赖标识；与 resolve 二选一 */
  token?: InjectionToken
  /** 自定义解析（如 Repository） */
  resolve?: () => unknown
}

export type ProviderMeta = {
  /** 注册键（类或自定义 id） */
  token: InjectionToken
  /** 实际用来 new 的类 */
  useClass: ClassToken
  scope: ScopeValue
}

export type ProvideOptions = {
  /** 自定义标识，可用 `@Inject('id')` / `Ioc.get('id')` */
  id?: string | symbol
  /** 作用域，默认 singleton */
  scope?: ScopeValue
}
