# dev and qa environments usually have only one nat gateway, staging and produciton usually have 3
locals {
  nat_name_suffixes = [
    "nat-1",
    "nat-2",
    "nat-3",
  ]
}

data "aws_nat_gateway" "delphi_dev" {
  provider = aws.gdb-delphi-dev
  tags = {
    Name = "dev-delphi-${local.nat_name_suffixes[0]}"
  }
}

data "aws_nat_gateway" "delphi_qa" {
  provider = aws.gdb-delphi-dev
  tags = {
    Name = "qa-delphi-${local.nat_name_suffixes[0]}"
  }
}

data "aws_nat_gateway" "delphi_stage" {
  provider = aws.gdb-delphi-dev
  count    = length(local.nat_name_suffixes)
  tags = {
    Name = "stage-delphi-${local.nat_name_suffixes[count.index]}"
  }
}

data "aws_nat_gateway" "delphi_prod" {
  provider = aws.gdb-delphi-prod
  count    = length(local.nat_name_suffixes)
  tags = {
    Name = "prod-delphi-${local.nat_name_suffixes[count.index]}"
  }
}

data "aws_nat_gateway" "apollo_dev" {
  provider = aws.gdb-delphi-dev
  tags = {
    Name = "dev-apollo-${local.nat_name_suffixes[0]}"
  }
}

data "aws_nat_gateway" "apollo_prod" {
  provider = aws.gdb-delphi-prod
  count    = length(local.nat_name_suffixes)
  tags = {
    Name = "prod-apollo-${local.nat_name_suffixes[count.index]}"
  }
}

data "aws_nat_gateway" "apollo_new_dev" {
  provider = aws.gdb-apollo-dev
  tags = {
    Name = "dev-apollo-${local.nat_name_suffixes[0]}"
  }
}

data "aws_nat_gateway" "apollo_new_qa" {
  provider = aws.gdb-apollo-dev
  tags = {
    Name = "qa-apollo-${local.nat_name_suffixes[0]}"
  }
}

data "aws_nat_gateway" "apollo_new_stage" {
  provider = aws.gdb-apollo-dev
  tags = {
    Name = "stage-apollo-${local.nat_name_suffixes[0]}"
  }
}

data "aws_nat_gateway" "apollo_new_uat" {
  provider = aws.gdb-apollo-prod
  tags = {
    Name = "uat-apollo-${local.nat_name_suffixes[0]}"
  }
}

data "aws_nat_gateway" "apollo_new_prod" {
  provider = aws.gdb-apollo-prod
  count    = length(local.nat_name_suffixes)
  tags = {
    Name = "prod-apollo-${local.nat_name_suffixes[count.index]}"
  }
}

/*
data "aws_nat_gateway" "core_dev" {
  provider = aws.gdb-core-dev
  tags = {
    Name = "dev-core-${local.nat_name_suffixes[0]}"
  }
}

data "aws_nat_gateway" "core_qa" {
  provider = aws.gdb-core-dev
  tags = {
    Name = "qa-core-${local.nat_name_suffixes[0]}"
  }
}
*/
data "aws_nat_gateway" "core_uat" {
  provider = aws.gdb-core-prod
  tags = {
    Name = "uat-core-${local.nat_name_suffixes[0]}"
  }
}

data "aws_nat_gateway" "core_prod" {
  provider = aws.gdb-core-prod
  count    = length(local.nat_name_suffixes)
  tags = {
    Name = "prod-core-${local.nat_name_suffixes[count.index]}"
  }
}

data "aws_nat_gateway" "infra_dev" {
  provider = aws.gdb-infra-dev
  tags = {
    Name = "dev-infra-${local.nat_name_suffixes[0]}"
  }
}

data "aws_nat_gateway" "infra_dev_jenkins" {
  provider = aws.gdb-infra-dev
  tags = {
    Name = "dev-infra-jenkins-${local.nat_name_suffixes[0]}"
  }
}

data "aws_nat_gateway" "infra_prod" {
  provider = aws.gdb-infra-prod
  tags = {
    Name = "prod-infra-${local.nat_name_suffixes[0]}"
  }
}

locals {
  full_nat_list = concat(
    [
      { cidr = "${data.aws_nat_gateway.delphi_dev.public_ip}/32", description = "delphi dev NAT" },
      { cidr = "${data.aws_nat_gateway.delphi_qa.public_ip}/32", description = "delphi qa NAT" },
      { cidr = "${data.aws_nat_gateway.apollo_dev.public_ip}/32", description = "apollo dev NAT" },
      { cidr = "${data.aws_nat_gateway.apollo_new_dev.public_ip}/32", description = "apollo new dev NAT" },
      { cidr = "${data.aws_nat_gateway.apollo_new_qa.public_ip}/32", description = "apollo new qa NAT" },
      { cidr = "${data.aws_nat_gateway.apollo_new_stage.public_ip}/32", description = "apollo new stage NAT" },
      { cidr = "${data.aws_nat_gateway.apollo_new_uat.public_ip}/32", description = "apollo new uat NAT" },
      { cidr = "${data.aws_nat_gateway.infra_dev.public_ip}/32", description = "infra dev NAT" },
      { cidr = "${data.aws_nat_gateway.infra_dev_jenkins.public_ip}/32", description = "infra dev jenkins NAT" },
      { cidr = "${data.aws_nat_gateway.infra_prod.public_ip}/32", description = "infra prod NAT" },
      // { cidr = "${data.aws_nat_gateway.core_dev.public_ip}/32", description = "core dev NAT" },
      // { cidr = "${data.aws_nat_gateway.core_qa.public_ip}/32", description = "core qa NAT" },
      { cidr = "${data.aws_nat_gateway.core_uat.public_ip}/32", description = "core uat NAT" },
    ],
    [
      for public_ip in data.aws_nat_gateway.delphi_stage[*].public_ip :
      { cidr = "${public_ip}/32", description = "delphi stage NAT" }
    ],
    [
      for public_ip in data.aws_nat_gateway.delphi_prod[*].public_ip :
      { cidr = "${public_ip}/32", description = "delphi prod NAT" }
    ],
    [
      for public_ip in data.aws_nat_gateway.apollo_new_prod[*].public_ip :
      { cidr = "${public_ip}/32", description = "apollo new prod NAT" }
    ],
    [
      for public_ip in data.aws_nat_gateway.apollo_prod[*].public_ip :
      { cidr = "${public_ip}/32", description = "apollo prod NAT" }
    ],
    [
      for public_ip in data.aws_nat_gateway.core_prod[*].public_ip :
      { cidr = "${public_ip}/32", description = "core prod NAT" }
    ],
  )

  filtered_list = [
    for record in local.full_nat_list :
    record if contains(var.allowed_envs, trimsuffix(record["description"], " NAT"))
  ]
}

