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

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 RejectionStatementArgs extends core.SchemaArgs {
  message: core.Array<Message> | core.ArrayOut<Message>;

  responseCard?: string | core.StringOut;
}

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

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

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

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

  responseCard?: string | core.StringOut;
}

export class ValueElicitationPrompt extends core.Schema<ValueElicitationPromptArgs> {
  @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 SlotArgs extends core.SchemaArgs {
  description?: string | core.StringOut;

  name: string | core.StringOut;

  priority?: number | core.NumberOut;

  responseCard?: string | core.StringOut;

  sampleUtterances?: core.Array<string> | core.ArrayOut<core.StringOut>;

  slotConstraint: string | core.StringOut;

  slotType: string | core.StringOut;

  slotTypeVersion?: string | core.StringOut;

  valueElicitationPrompt?: ValueElicitationPrompt;
}

export class Slot extends core.Schema<SlotArgs> {
  @core.attr(String)
  public description?: string | core.StringOut;

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

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

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

  @core.attr(String, { kind: "array" })
  public sampleUtterances?: core.Array<string> | core.ArrayOut<core.StringOut>;

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

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

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

  @core.attr(ValueElicitationPrompt)
  public valueElicitationPrompt?: ValueElicitationPrompt;
}

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

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

  responseCard?: string | core.StringOut;
}

export class Prompt extends core.Schema<PromptArgs> {
  @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 FollowUpPromptArgs extends core.SchemaArgs {
  prompt: Prompt;

  rejectionStatement: RejectionStatement;
}

export class FollowUpPrompt extends core.Schema<FollowUpPromptArgs> {
  @core.attr(Prompt)
  public prompt!: Prompt;

  @core.attr(RejectionStatement)
  public rejectionStatement!: RejectionStatement;
}

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

  responseCard?: string | core.StringOut;
}

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

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

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

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

  responseCard?: string | core.StringOut;
}

export class ConfirmationPrompt extends core.Schema<ConfirmationPromptArgs> {
  @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 CodeHookArgs extends core.SchemaArgs {
  messageVersion: string | core.StringOut;

  uri: string | core.StringOut;
}

export class CodeHook extends core.Schema<CodeHookArgs> {
  @core.attr(String)
  public messageVersion!: string | core.StringOut;

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

export interface FulfillmentActivityArgs extends core.SchemaArgs {
  codeHook?: CodeHook;

  type: string | core.StringOut;
}

export class FulfillmentActivity extends core.Schema<FulfillmentActivityArgs> {
  @core.attr(CodeHook)
  public codeHook?: CodeHook;

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

export interface DialogCodeHookArgs extends core.SchemaArgs {
  messageVersion: string | core.StringOut;

  uri: string | core.StringOut;
}

export class DialogCodeHook extends core.Schema<DialogCodeHookArgs> {
  @core.attr(String)
  public messageVersion!: string | core.StringOut;

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

export interface IntentArgs extends core.ResourceArgs {
  conclusionStatement?: ConclusionStatement;

  confirmationPrompt?: ConfirmationPrompt;

  createVersion?: boolean | core.BooleanOut;

  description?: string | core.StringOut;

  dialogCodeHook?: DialogCodeHook;

  followUpPrompt?: FollowUpPrompt;

  fulfillmentActivity: FulfillmentActivity;

  name: string | core.StringOut;

  parentIntentSignature?: string | core.StringOut;

  rejectionStatement?: RejectionStatement;

  sampleUtterances?: core.Array<string> | core.ArrayOut<core.StringOut>;

  slot?: core.Array<Slot> | core.ArrayOut<Slot>;
}

export class Intent extends core.Resource<IntentArgs> {
  @core.attr(String, { computed: true })
  public arn!: string | core.StringOut;

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

  @core.attr(ConclusionStatement)
  public conclusionStatement?: ConclusionStatement;

  @core.attr(ConfirmationPrompt)
  public confirmationPrompt?: ConfirmationPrompt;

  @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(DialogCodeHook)
  public dialogCodeHook?: DialogCodeHook;

  @core.attr(FollowUpPrompt)
  public followUpPrompt?: FollowUpPrompt;

  @core.attr(FulfillmentActivity)
  public fulfillmentActivity!: FulfillmentActivity;

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

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

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

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

  @core.attr(RejectionStatement)
  public rejectionStatement?: RejectionStatement;

  @core.attr(String, { kind: "array" })
  public sampleUtterances?: core.Array<string> | core.ArrayOut<core.StringOut>;

  @core.attr(Slot, { kind: "array" })
  public slot?: core.Array<Slot> | core.ArrayOut<Slot>;

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

  constructor(name: string, args?: IntentArgs) {
    super(name, "aws_lex_intent", args);
  }

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