import type { Querier, Schema, TransactionalDatabase } from '@platform-modules/db'

export type EntitlementGrant = typeof import('./schema.js').entitlements.$inferSelect
export type EntitlementTierGrant = typeof import('./schema.js').entitlementTierGrants.$inferSelect
export type EntitlementsSchema = typeof import('./schema.js').entitlementsSchema

export type EntitlementSubject =
  | string
  | {
      account: string
      tenancy?: string | null
    }

export type TierRef = {
  capability: string
  tier: string
}

export type EntitlementClock = {
  __entitlementsNow?: () => Date
}

export type EntitlementQuerier<S extends Schema = Record<string, never>> =
  Querier<S & EntitlementsSchema>

export type EntitlementDatabase<S extends Schema = Record<string, never>> =
  TransactionalDatabase<S & EntitlementsSchema> & EntitlementClock

export type EntitlementsService = {
  can(subject: EntitlementSubject, capability: string): Promise<boolean>
  quota(subject: EntitlementSubject, key: string): Promise<number>
  setTier(subject: EntitlementSubject, tier: TierRef): Promise<void>
}
