locals {
  overrides_by_account_id = {
    103233932089 = {
      vpc_name                   = "dev"
      private_subnet_name_filter = "private*"
      public_subnet_name_filter  = "public*"
    }
    437795906767 = {
      vpc_name = "prod"
      overrides_by_environment = {
        qa = {
          excluded_private_subnets = [
            # Exclude these subnets for QA because they are low on available IP addresses
            "subnet-067a6b45b079d7296",
            "subnet-043d235081c966332",
          ]
        }
      }
    }
  }

  account_level_overrides     = lookup(local.overrides_by_account_id, data.aws_caller_identity.current.account_id, {})
  environment_level_overrides = lookup(lookup(local.account_level_overrides, "overrides_by_environment", {}), var.environment, {})
  overrides                   = merge(local.account_level_overrides, local.environment_level_overrides)

  vpc_name                   = lookup(local.overrides, "vpc_name", "${var.environment}-terraform-aws-vpc")
  private_subnet_name_filter = lookup(local.overrides, "private_subnet_name_filter", "*_private_*")
  public_subnet_name_filter  = lookup(local.overrides, "public_subnet_name_filter", "*_public_*")
  excluded_private_subnets   = lookup(local.overrides, "excluded_private_subnets", [])
  excluded_public_subnets    = lookup(local.overrides, "excluded_public_subnets", [])
}

data "aws_caller_identity" "current" {}

data "aws_vpc" "vpc" {
  tags = {
    Name = local.vpc_name
  }
}

data "aws_subnets" "private" {
  filter {
    name   = "vpc-id"
    values = [data.aws_vpc.vpc.id]
  }
  tags = {
    Name = local.private_subnet_name_filter
  }
}

data "aws_subnet" "private" {
  for_each = toset([for subnet_id in data.aws_subnets.private.ids : subnet_id if !contains(local.excluded_private_subnets, subnet_id)])
  id       = each.value
}

data "aws_subnets" "public" {
  filter {
    name   = "vpc-id"
    values = [data.aws_vpc.vpc.id]
  }
  tags = {
    Name = local.public_subnet_name_filter
  }
}

data "aws_subnet" "public" {
  for_each = toset([for subnet_id in data.aws_subnets.public.ids : subnet_id if !contains(local.excluded_public_subnets, subnet_id)])
  id       = each.value
}
