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

export interface LevelFourArgs extends core.SchemaArgs {
  arn: string | core.StringOut;

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

export interface LevelFiveArgs extends core.SchemaArgs {
  arn: string | core.StringOut;

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

export interface LevelOneArgs extends core.SchemaArgs {
  arn: string | core.StringOut;

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

export interface LevelTwoArgs extends core.SchemaArgs {
  arn: string | core.StringOut;

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

export interface LevelThreeArgs extends core.SchemaArgs {
  arn: string | core.StringOut;

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

export interface HierarchyPathArgs extends core.SchemaArgs {
  levelFive: core.Array<LevelFive> | core.ArrayOut<LevelFive>;

  levelFour: core.Array<LevelFour> | core.ArrayOut<LevelFour>;

  levelOne: core.Array<LevelOne> | core.ArrayOut<LevelOne>;

  levelThree: core.Array<LevelThree> | core.ArrayOut<LevelThree>;

  levelTwo: core.Array<LevelTwo> | core.ArrayOut<LevelTwo>;
}

export class HierarchyPath extends core.Schema<HierarchyPathArgs> {
  @core.attr(LevelFive, { computed: true, kind: "array" })
  public levelFive!: core.Array<LevelFive> | core.ArrayOut<LevelFive>;

  @core.attr(LevelFour, { computed: true, kind: "array" })
  public levelFour!: core.Array<LevelFour> | core.ArrayOut<LevelFour>;

  @core.attr(LevelOne, { computed: true, kind: "array" })
  public levelOne!: core.Array<LevelOne> | core.ArrayOut<LevelOne>;

  @core.attr(LevelThree, { computed: true, kind: "array" })
  public levelThree!: core.Array<LevelThree> | core.ArrayOut<LevelThree>;

  @core.attr(LevelTwo, { computed: true, kind: "array" })
  public levelTwo!: core.Array<LevelTwo> | core.ArrayOut<LevelTwo>;
}

export interface UserHierarchyGroupArgs extends core.ResourceArgs {
  instanceId: string | core.StringOut;

  name: string | core.StringOut;

  parentGroupId?: string | core.StringOut;

  tags?: core.Map<string, string> | core.MapOut<core.StringOut>;

  tagsAll?: core.Map<string, string> | core.MapOut<core.StringOut>;
}

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

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

  @core.attr(HierarchyPath, { computed: true, kind: "array" })
  public hierarchyPath!:
    | core.Array<HierarchyPath>
    | core.ArrayOut<HierarchyPath>;

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

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

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

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

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

  @core.attr(String, { kind: "map" })
  public tags?: core.Map<string, string> | core.MapOut<core.StringOut>;

  @core.attr(String, { computed: true, kind: "map" })
  public tagsAll?: core.Map<string, string> | core.MapOut<core.StringOut>;

  constructor(name: string, args?: UserHierarchyGroupArgs) {
    super(name, "aws_connect_user_hierarchy_group", args);
  }

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