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

export interface SmbActiveDirectorySettingsArgs extends core.SchemaArgs {
  activeDirectoryStatus: string | core.StringOut;

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

  domainName: string | core.StringOut;

  organizationalUnit?: string | core.StringOut;

  password: string | core.StringOut;

  timeoutInSeconds?: number | core.NumberOut;

  username: string | core.StringOut;
}

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

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

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

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

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

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

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

export interface GatewayNetworkInterfaceArgs extends core.SchemaArgs {
  ipv4Address: string | core.StringOut;
}

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

export interface MaintenanceStartTimeArgs extends core.SchemaArgs {
  dayOfMonth?: string | core.StringOut;

  dayOfWeek?: string | core.StringOut;

  hourOfDay: number | core.NumberOut;

  minuteOfHour?: number | core.NumberOut;
}

export class MaintenanceStartTime extends core.Schema<MaintenanceStartTimeArgs> {
  @core.attr(String)
  public dayOfMonth?: string | core.StringOut;

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

  @core.attr(Number)
  public hourOfDay!: number | core.NumberOut;

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

export interface GatewayArgs extends core.ResourceArgs {
  activationKey?: string | core.StringOut;

  averageDownloadRateLimitInBitsPerSec?: number | core.NumberOut;

  averageUploadRateLimitInBitsPerSec?: number | core.NumberOut;

  cloudwatchLogGroupArn?: string | core.StringOut;

  gatewayIpAddress?: string | core.StringOut;

  gatewayName: string | core.StringOut;

  gatewayTimezone: string | core.StringOut;

  gatewayType?: string | core.StringOut;

  gatewayVpcEndpoint?: string | core.StringOut;

  maintenanceStartTime?: MaintenanceStartTime;

  mediumChangerType?: string | core.StringOut;

  smbActiveDirectorySettings?: SmbActiveDirectorySettings;

  smbFileShareVisibility?: boolean | core.BooleanOut;

  smbGuestPassword?: string | core.StringOut;

  smbSecurityStrategy?: string | core.StringOut;

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

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

  tapeDriveType?: string | core.StringOut;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  @core.attr(MaintenanceStartTime, { computed: true })
  public maintenanceStartTime?: MaintenanceStartTime;

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

  @core.attr(SmbActiveDirectorySettings)
  public smbActiveDirectorySettings?: SmbActiveDirectorySettings;

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

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

  @core.attr(String, { computed: true })
  public smbSecurityStrategy?: 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>;

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

  constructor(name: string, args?: GatewayArgs) {
    super(name, "aws_storagegateway_gateway", args);
  }

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