import * as Logger from 'bunyan'

export namespace ApiteM2Utility {
  interface PipelineContext {
    config: BasicExtensionConfig
    log: Logger
    meta: PipelineContextMeta
    storage: PipelineStorageContainer
  }

  interface BasicExtensionConfig {
    endpoint: string
    storeCode: string
    auth: {
      httpUser: string
      httpPass: string
    }
  }

  interface PipelineStorageGetCallback {
    (err: Error | null, value: any): void
  }

  interface PipelineStorageDelCallback {
    (err: Error | null, value: string | number | Object): void
  }

  interface PipelineStorageSetCallback {
    (err: Error | null, value: string | number | Object): void
  }

  interface PipelineStorage {
    get (key: string, callback: PipelineStorageGetCallback): void
    get (key: string): Promise<any>
    set (key: string, value: string | number | Object, callback: PipelineStorageSetCallback): void
    set (key: string, value: string | number | Object): Promise<void>
    del (key: string, callback: PipelineStorageDelCallback): void | Promise<void>
    del (key: string): Promise<void>
  }

  interface PipelineStorageContainer {
    user: PipelineStorage
    device: PipelineStorage
    extension: PipelineStorage
  }

  interface PipelineContextMeta {
    userId?: string
    appId: string,
    deviceId: string,
    headers: Array<string> | undefined,
    cookies: Array<string> | undefined,
  }
}
