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

export interface DatabaseArgs extends core.SchemaArgs {
  catalogId?: string | core.StringOut;

  name: string | core.StringOut;
}

export class Database extends core.Schema<DatabaseArgs> {
  @core.attr(String, { computed: true })
  public catalogId?: string | core.StringOut;

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

export interface LfTagArgs extends core.SchemaArgs {
  catalogId?: string | core.StringOut;

  key: string | core.StringOut;

  value: string | core.StringOut;
}

export class LfTag extends core.Schema<LfTagArgs> {
  @core.attr(String, { computed: true })
  public catalogId?: string | core.StringOut;

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

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

export interface TableArgs extends core.SchemaArgs {
  catalogId?: string | core.StringOut;

  databaseName: string | core.StringOut;

  name?: string | core.StringOut;

  wildcard?: boolean | core.BooleanOut;
}

export class Table extends core.Schema<TableArgs> {
  @core.attr(String, { computed: true })
  public catalogId?: string | core.StringOut;

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

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

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

export interface TableWithColumnsArgs extends core.SchemaArgs {
  catalogId?: string | core.StringOut;

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

  databaseName: string | core.StringOut;

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

  name: string | core.StringOut;

  wildcard?: boolean | core.BooleanOut;
}

export class TableWithColumns extends core.Schema<TableWithColumnsArgs> {
  @core.attr(String, { computed: true })
  public catalogId?: string | core.StringOut;

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

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

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

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

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

export interface ResourceLfTagsArgs extends core.ResourceArgs {
  catalogId?: string | core.StringOut;

  database?: Database;

  lfTag: core.Array<LfTag> | core.ArrayOut<LfTag>;

  table?: Table;

  tableWithColumns?: TableWithColumns;
}

export class ResourceLfTags extends core.Resource<ResourceLfTagsArgs> {
  @core.attr(String, { computed: true })
  public catalogId?: string | core.StringOut;

  @core.attr(Database, { computed: true })
  public database?: Database;

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

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

  @core.attr(Table, { computed: true })
  public table?: Table;

  @core.attr(TableWithColumns, { computed: true })
  public tableWithColumns?: TableWithColumns;

  constructor(name: string, args?: ResourceLfTagsArgs) {
    super(name, "aws_lakeformation_resource_lf_tags", args);
  }

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