/**
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
import { Memory } from './Memory'
import { ScoreInput, ScoreResponse } from './Score'
import { TrainExtractorStep, TrainScorerStep, LogicAPIError } from './TrainDialog'
import { EntityBase } from './Entity'
import { ExtractResponse } from './Extract'
import { TeachResponse } from './Teach'
import { AppList } from './App'
import { CLChannelData } from './CLChannelData'

export const CL_USER_NAME_ID = 'CLTrainer'
export const MEMORY_KEY_HEADER_NAME = 'x-conversationlearner-memory-key'
export const BOT_CHECKSUM_HEADER_NAME = 'x-conversationlearner-bot-checksum'

/** Indicates whether END_SESSION was called on the running Session */
export enum SessionEndState {
  /** Session ended because END_SESSION activity has been called */
  COMPLETED = 'completed',
  /** Session ended because of timeout or new session started w/o END_SESSION activity */
  OPEN = 'open'
}

export enum ScoreReason {
  // Action has been masked
  NotAvailable = 'notAvailable',

  // Action can't be scored because it hasn't been trained yet
  NotScorable = 'notScorable',

  // Score has not yet been calculated
  NotCalculated = 'notCalculated'
}

export interface UIScoreInput {
  trainExtractorStep: TrainExtractorStep | null
  extractResponse: ExtractResponse
}

export interface UIExtractResponse {
  extractResponse: ExtractResponse
  memories: Memory[]
}

export interface UIPostScoreResponse {
  teachResponse: TeachResponse
  isEndTask: Boolean
  memories: Memory[]
}

export interface UIScoreResponse {
  scoreResponse?: ScoreResponse
  scoreInput?: ScoreInput
  memories?: Memory[]
  extractConflict?: ExtractResponse | null
  botAPIError?: LogicAPIError | null
}

export interface UITrainScorerStep {
  trainScorerStep: TrainScorerStep
  clData: CLChannelData
  entities: EntityBase[]
}

export interface UIAppList {
  appList: AppList
  activeApps: { [appId: string]: string } // appId: packageId
}
