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

export interface TechContactArgs extends core.SchemaArgs {
  addressLine1?: string | core.StringOut;

  addressLine2?: string | core.StringOut;

  city?: string | core.StringOut;

  contactType?: string | core.StringOut;

  countryCode?: string | core.StringOut;

  email?: string | core.StringOut;

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

  fax?: string | core.StringOut;

  firstName?: string | core.StringOut;

  lastName?: string | core.StringOut;

  organizationName?: string | core.StringOut;

  phoneNumber?: string | core.StringOut;

  state?: string | core.StringOut;

  zipCode?: string | core.StringOut;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

export interface RegistrantContactArgs extends core.SchemaArgs {
  addressLine1?: string | core.StringOut;

  addressLine2?: string | core.StringOut;

  city?: string | core.StringOut;

  contactType?: string | core.StringOut;

  countryCode?: string | core.StringOut;

  email?: string | core.StringOut;

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

  fax?: string | core.StringOut;

  firstName?: string | core.StringOut;

  lastName?: string | core.StringOut;

  organizationName?: string | core.StringOut;

  phoneNumber?: string | core.StringOut;

  state?: string | core.StringOut;

  zipCode?: string | core.StringOut;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

export interface AdminContactArgs extends core.SchemaArgs {
  addressLine1?: string | core.StringOut;

  addressLine2?: string | core.StringOut;

  city?: string | core.StringOut;

  contactType?: string | core.StringOut;

  countryCode?: string | core.StringOut;

  email?: string | core.StringOut;

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

  fax?: string | core.StringOut;

  firstName?: string | core.StringOut;

  lastName?: string | core.StringOut;

  organizationName?: string | core.StringOut;

  phoneNumber?: string | core.StringOut;

  state?: string | core.StringOut;

  zipCode?: string | core.StringOut;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

export interface NameServerArgs extends core.SchemaArgs {
  glueIps?: core.Array<string> | core.ArrayOut<core.StringOut>;

  name: string | core.StringOut;
}

export class NameServer extends core.Schema<NameServerArgs> {
  @core.attr(String, { kind: "array" })
  public glueIps?: core.Array<string> | core.ArrayOut<core.StringOut>;

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

export interface RegisteredDomainArgs extends core.ResourceArgs {
  adminContact?: AdminContact;

  adminPrivacy?: boolean | core.BooleanOut;

  autoRenew?: boolean | core.BooleanOut;

  domainName: string | core.StringOut;

  nameServer?: core.Array<NameServer> | core.ArrayOut<NameServer>;

  registrantContact?: RegistrantContact;

  registrantPrivacy?: boolean | core.BooleanOut;

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

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

  techContact?: TechContact;

  techPrivacy?: boolean | core.BooleanOut;

  transferLock?: boolean | core.BooleanOut;
}

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

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

  @core.attr(AdminContact, { computed: true })
  public adminContact?: AdminContact;

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

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

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

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

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

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

  @core.attr(NameServer, { computed: true, kind: "array" })
  public nameServer?: core.Array<NameServer> | core.ArrayOut<NameServer>;

  @core.attr(RegistrantContact, { computed: true })
  public registrantContact?: RegistrantContact;

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

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

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

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

  @core.attr(String, { computed: true, kind: "array" })
  public statusList!: core.Array<string> | core.ArrayOut<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>;

  @core.attr(TechContact, { computed: true })
  public techContact?: TechContact;

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

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

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

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

  constructor(name: string, args?: RegisteredDomainArgs) {
    super(name, "aws_route53domains_registered_domain", args);
  }

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