import type { CacheDriver } from './driver';
import type { MasterCache } from '../mastercache';
import type { BusDriver, BusOptions } from './bus';

export * from './bus';
export * from './events';
export * from './driver';
export * from './helpers';
export * from './provider';
export * from './options/options';
export * from './options/drivers-options';
export * from './options/methods-options';

/**
 * Interface for a L1 cache driver. Probably a memory driver
 */
export interface L1CacheDriver extends CacheDriver<false> {
  type: 'l1'
  getRemainingTtl(key: string): number | undefined
}

/**
 * Interface for a L2, distributed cache driver.
 */
export interface L2CacheDriver extends CacheDriver<true> {
  type: 'l2'
}

/**
 * Factory result for a cache driver
 */
export interface CreateDriverResult<T extends L1CacheDriver | L2CacheDriver> {
  options: Record<string, any>
  factory: (config: any) => T
}

/**
 * Contract for a bus driver factory
 */
export interface CreateBusDriverResult {
  options: BusOptions
  factory: (config: any) => BusDriver
}

/**
 * Cache serializer contract
 */
export interface CacheSerializer {
  serialize: (value: any) => string
  deserialize: (value: any) => any
}

/**
 * Stack of cache drivers
 */
export interface CacheStackDrivers {
  l1Driver?: L1CacheDriver
  l2Driver?: L2CacheDriver
  busDriver?: BusDriver
  busOptions?: BusOptions
}

/**
 * A Mastercache Plugin
 */
export interface MasterCachePlugin {
  register(mastercache: MasterCache<any>): void
}

/**
 * Dialect available for the SQL driver
 */
export type DialectName = 'pg' | 'mysql2' | 'better-sqlite3' | 'sqlite3'
