import { SourceNames } from "./datasource"

interface Base {
  _id?: string
  _rev?: string
}

export interface FieldSchema {
  // TODO: replace with field types enum when done
  type: string
  fieldName?: string
  name: string
  tableId?: string
  relationshipType?: string
  through?: string
  foreignKey?: string
  autocolumn?: boolean
  throughFrom?: string
  throughTo?: string
  main?: boolean
  meta?: {
    toTable: string
    toKey: string
  }
  constraints?: {
    type?: string
    email?: boolean
    inclusion?: string[]
    length?: {
      minimum?: string | number
      maximum?: string | number
    }
    presence?: boolean
  }
}

export interface TableSchema {
  [key: string]: FieldSchema
}

export interface Table extends Base {
  type?: string
  views?: {}
  name: string
  primary?: string[]
  schema: TableSchema
  primaryDisplay?: string
  sourceId?: string
  constrained?: string[]
}

export interface Row extends Base {
  type?: string
  tableId?: string
  [key: string]: any
}

interface JsonSchemaField {
  properties: {
    [key: string]: {
      type: string
      title: string
      customType?: string
    }
  }
  required?: string[]
}

export interface AutomationStep {
  description: string
  event?: string
  icon: string
  id: string
  inputs: {
    [key: string]: any
  }
  name: string
  schema: {
    inputs: JsonSchemaField
    outputs: JsonSchemaField
  }
  stepId: string
  tagline: string
  type: string
}

export interface Automation extends Base {
  name: string
  type: string
  appId?: string
  definition: {
    steps: AutomationStep[]
    trigger?: AutomationStep
  }
}

export interface Datasource extends Base {
  type: string
  name: string
  source: SourceNames
  // the config is defined by the schema
  config: {
    [key: string]: string | number | boolean
  }
  plus: boolean
  entities?: {
    [key: string]: Table
  }
}

export interface QueryParameter {
  name: string
  default: string
}

export interface Query {
  _id?: string
  datasourceId: string
  name: string
  parameters: QueryParameter[]
  fields: {
    headers: object
    queryString: string | null
    path: string
    requestBody: string | undefined
  }
  transformer: string | null
  schema: any
  readable: boolean
  queryVerb: string
}