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

export interface HealthCheckArgs extends core.SchemaArgs {
  enabled: boolean | core.BooleanOut;

  healthyThreshold: number | core.NumberOut;

  interval: number | core.NumberOut;

  matcher: string | core.StringOut;

  path: string | core.StringOut;

  port: string | core.StringOut;

  protocol: string | core.StringOut;

  timeout: number | core.NumberOut;

  unhealthyThreshold: number | core.NumberOut;
}

export class HealthCheck extends core.Schema<HealthCheckArgs> {
  @core.attr(Boolean, { computed: true })
  public enabled!: boolean | core.BooleanOut;

  @core.attr(Number, { computed: true })
  public healthyThreshold!: number | core.NumberOut;

  @core.attr(Number, { computed: true })
  public interval!: number | core.NumberOut;

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

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

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

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

  @core.attr(Number, { computed: true })
  public timeout!: number | core.NumberOut;

  @core.attr(Number, { computed: true })
  public unhealthyThreshold!: number | core.NumberOut;
}

export interface StickinessArgs extends core.SchemaArgs {
  cookieDuration: number | core.NumberOut;

  cookieName: string | core.StringOut;

  enabled: boolean | core.BooleanOut;

  type: string | core.StringOut;
}

export class Stickiness extends core.Schema<StickinessArgs> {
  @core.attr(Number, { computed: true })
  public cookieDuration!: number | core.NumberOut;

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

  @core.attr(Boolean, { computed: true })
  public enabled!: boolean | core.BooleanOut;

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

export interface DsLbTargetGroupArgs {
  arn?: string | core.StringOut;

  name?: string | core.StringOut;

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

export class DsLbTargetGroup extends core.Data<DsLbTargetGroupArgs> {
  @core.attr(String, { computed: true })
  public arn?: string | core.StringOut;

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

  @core.attr(Boolean, { computed: true })
  public connectionTermination!: boolean | core.BooleanOut;

  @core.attr(Number, { computed: true })
  public deregistrationDelay!: number | core.NumberOut;

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

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

  @core.attr(Boolean, { computed: true })
  public lambdaMultiValueHeadersEnabled!: boolean | core.BooleanOut;

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

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

  @core.attr(Number, { computed: true })
  public port!: number | core.NumberOut;

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

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

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

  @core.attr(Boolean, { computed: true })
  public proxyProtocolV2!: boolean | core.BooleanOut;

  @core.attr(Number, { computed: true })
  public slowStart!: number | core.NumberOut;

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

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

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

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

  constructor(name: string, args?: DsLbTargetGroupArgs) {
    super(name, "aws_lb_target_group", args);
  }

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