export interface HyperdriveBinding {
  connectionString?: string
}

export interface RateLimitBinding {
  get(key: string): Promise<string | null>
  put(
    key: string,
    value: string,
    options?: {
      expirationTtl?: number
    },
  ): Promise<void>
}

export interface QueueBinding<T = unknown> {
  send(message: T): Promise<void>
}

export interface PressZoneBindings {
  AUTH_PEPPER?: string
  AUTH_SESSION_SECRET?: string
  DATABASE_URL?: string
  HYPERDRIVE?: HyperdriveBinding
  JOBS_QUEUE?: QueueBinding
  RATE_LIMIT_KV?: RateLimitBinding
}

export interface AppConfig {
  authPepper: string
  authSessionSecret: string
  databaseUrl: string
}

function requireBinding(value: string | undefined, key: string): string {
  if (!value) {
    throw new Error(`Missing required binding: ${key}`)
  }

  return value
}

export function getDatabaseUrl(
  env: Pick<PressZoneBindings, 'DATABASE_URL' | 'HYPERDRIVE'>,
): string {
  return requireBinding(env.HYPERDRIVE?.connectionString ?? env.DATABASE_URL, 'DATABASE_URL')
}

export function loadConfig(env: PressZoneBindings): AppConfig {
  return {
    authPepper: requireBinding(env.AUTH_PEPPER, 'AUTH_PEPPER'),
    authSessionSecret: requireBinding(env.AUTH_SESSION_SECRET, 'AUTH_SESSION_SECRET'),
    databaseUrl: getDatabaseUrl(env),
  }
}
