import * as core from "@terrascript/core";

export interface IntentArgs extends core.SchemaArgs {
  intentName: string | core.StringOut;

  intentVersion: string | core.StringOut;
}

export class Intent extends core.Schema<IntentArgs> {
  @core.attr(String)
  public intentName!: string | core.StringOut;

  @core.attr(String)
  public intentVersion!: string | core.StringOut;
}

export interface MessageArgs extends core.SchemaArgs {
  content: string | core.StringOut;

  contentType: string | core.StringOut;

  groupNumber?: number | core.NumberOut;
}

export class Message extends core.Schema<MessageArgs> {
  @core.attr(String)
  public content!: string | core.StringOut;

  @core.attr(String)
  public contentType!: string | core.StringOut;

  @core.attr(Number)
  public groupNumber?: number | core.NumberOut;
}

export interface ClarificationPromptArgs extends core.SchemaArgs {
  maxAttempts: number | core.NumberOut;

  message: core.Array<Message> | core.ArrayOut<Message>;

  responseCard?: string | core.StringOut;
}

export class ClarificationPrompt extends core.Schema<ClarificationPromptArgs> {
  @core.attr(Number)
  public maxAttempts!: number | core.NumberOut;

  @core.attr(Message, { kind: "array" })
  public message!: core.Array<Message> | core.ArrayOut<Message>;

  @core.attr(String)
  public responseCard?: string | core.StringOut;
}

export interface AbortStatementArgs extends core.SchemaArgs {
  message: core.Array<Message> | core.ArrayOut<Message>;

  responseCard?: string | core.StringOut;
}

export class AbortStatement extends core.Schema<AbortStatementArgs> {
  @core.attr(Message, { kind: "array" })
  public message!: core.Array<Message> | core.ArrayOut<Message>;

  @core.attr(String)
  public responseCard?: string | core.StringOut;
}

export interface BotArgs extends core.ResourceArgs {
  abortStatement: AbortStatement;

  childDirected: boolean | core.BooleanOut;

  clarificationPrompt?: ClarificationPrompt;

  createVersion?: boolean | core.BooleanOut;

  description?: string | core.StringOut;

  detectSentiment?: boolean | core.BooleanOut;

  enableModelImprovements?: boolean | core.BooleanOut;

  idleSessionTtlInSeconds?: number | core.NumberOut;

  intent: core.Array<Intent> | core.ArrayOut<Intent>;

  locale?: string | core.StringOut;

  name: string | core.StringOut;

  nluIntentConfidenceThreshold?: number | core.NumberOut;

  processBehavior?: string | core.StringOut;

  voiceId?: string | core.StringOut;
}

export class Bot extends core.Resource<BotArgs> {
  @core.attr(AbortStatement)
  public abortStatement!: AbortStatement;

  @core.attr(String, { computed: true })
  public arn!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public checksum!: string | core.StringOut;

  @core.attr(Boolean)
  public childDirected!: boolean | core.BooleanOut;

  @core.attr(ClarificationPrompt)
  public clarificationPrompt?: ClarificationPrompt;

  @core.attr(Boolean)
  public createVersion?: boolean | core.BooleanOut;

  @core.attr(String, { computed: true })
  public createdDate!: string | core.StringOut;

  @core.attr(String)
  public description?: string | core.StringOut;

  @core.attr(Boolean)
  public detectSentiment?: boolean | core.BooleanOut;

  @core.attr(Boolean)
  public enableModelImprovements?: boolean | core.BooleanOut;

  @core.attr(String, { computed: true })
  public failureReason!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public id!: string | core.StringOut;

  @core.attr(Number)
  public idleSessionTtlInSeconds?: number | core.NumberOut;

  @core.attr(Intent, { kind: "array" })
  public intent!: core.Array<Intent> | core.ArrayOut<Intent>;

  @core.attr(String, { computed: true })
  public lastUpdatedDate!: string | core.StringOut;

  @core.attr(String)
  public locale?: string | core.StringOut;

  @core.attr(String)
  public name!: string | core.StringOut;

  @core.attr(Number)
  public nluIntentConfidenceThreshold?: number | core.NumberOut;

  @core.attr(String)
  public processBehavior?: string | core.StringOut;

  @core.attr(String, { computed: true })
  public status!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public version!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public voiceId?: string | core.StringOut;

  constructor(name: string, args?: BotArgs) {
    super(name, "aws_lex_bot", args);
  }

  public override getNamespace(): string {
    return "aws_lex";
  }
}
