import { JinjaExpression } from '../context/JinjaVariable'
import { ConditionalObject } from '../form/types'

export type InputType = 'bool' | 'int' | 'multiselect' | 'object' | 'list' | 'required-connection' | 'password' | 'select' | 'text'
  | 'generated-connection'

export type InputValuesByEnv = {
  envName: string,
  // Define se o valor pode ser alterado ou não. Ex: valor de contexto definido a nivel de account que não pode ser alterado. Ex: DNS raiz
  // tem de ser sempre *.stackspot.com
  mandate: boolean,
  source: 'ACCOUNT' | 'WORKSPACE' | 'STACK', // Quem definiu o mandate deste valor. Ex: Se é definido a nivel de account ou workspace
  value: any,
}

export interface ContextInput {
  type: InputType,
  condition?: ConditionalObject | JinjaExpression,
  default?: any, // IRÁ CONTER JINJA // Poderá ser uma expressão Jinja, ou seja, o valor default pode mudar em tempo de execução.
  help?: string, // Tooltip no label com texto de ajuda descrevendo o que é o input (i)
  inputEnv?: boolean, // Inputs em que definimos o valor dele por ambiente. Somente a raiz pode ser inputEnt. Inputs em objetos não. 
  items?: string[], // Só vale pro tipo select - Conversar com Digão sobre manter apenas items ou itemsValues
  itemsValues?: string[], // Só vale pro select
  label: string,
  name: string, // não é único e pode ter mais de um no mesmo form.
  isGlobal?: boolean, // O valor dele pode ser usado em cálculos de condições, ou computed-inputs, de outros plugins. 
  pattern?: string, // Regex
  // CONTEM JINJA // Só é valido p/ Select e Multiselect. Carrega opções de forma dinâmica. 
  // https://docs.stackspot.com/create-use/create-content/yaml-files/inputs#source
  externalItems?: JinjaExpression,
  required?: boolean, // True por padrão
  schema?: string, // Especifico para criaçao de connection interface manual
  connectionInterfaceType?: string, // Só existe quando o type é required-connection ou generated-connection
  // Só vai ser definido quando for do tipo lista. https://docs.stackspot.com/create-use/create-content/yaml-files/inputs#input-do-tipo-list
  input?: ContextInput,
  inputs?: ContextInput[], // Só vai ter quando o input for do tipo objeto.
  // Só existe no input da raiz. Inputs em objetos seguem valuesByEnv do pai. O valor do input sempre está dentro desta lista. Quando o 
  // inputEnv é falso, assumimos que o valor é o primeiro elemento da lista.
  valuesByEnv?: InputValuesByEnv[],
}

export interface ComputedInput {
  name: string,
  expression: JinjaExpression,
}

export type GeneratedConnectionInterfaces = Record<string, { type: string, value: string }>
