locals {
  overrides_by_account_id = {
    103233932089 = {
      vpc_name                   = "dev"
      private_subnet_name_filter = "private*"
      public_subnet_name_filter  = "public*"
    }
    437795906767 = {
      vpc_name                   = "prod"
      private_subnet_name_filter = ""
      public_subnet_name_filter  = ""
      overrides_by_environment = {
        qa = {
          private_subnets = [
            "subnet-04f670ff4b31e9978",
            "subnet-0a88ca43f1cfa4996",
            "subnet-0362fedb65294577f",
            "subnet-0620b664a509513b1",
          ]
          public_subnets = [
            "subnet-0862a9d380d77464f",
            "subnet-0a384837a4a30790a",
            "subnet-0dbe4f92fd1515e80",
          ]
        }
        prod = {
          private_subnets = [
            "subnet-098b89d0c58c5693a",
            "subnet-5366ef24",
            "subnet-0bc534925e6b8d780",
          ]
          public_subnets = [
            "subnet-0dbe4f92fd1515e80",
            "subnet-0f4dba24",
            "subnet-30e29047",
          ]
        }
        uat = {
          private_subnets = [
            "subnet-025cc6db612f5b664",
            "subnet-02486a700ad3d7906",
            "subnet-09c50fc7468a148b1"
          ]
          public_subnets = [
            "subnet-006524f5bf1eddc34",
            "subnet-04c5696c46fa06476",
            "subnet-003ad47587e88bf1f"
          ]
        }
      }
    }
    989790945997 = {
      overrides_by_environment = {
        uat = {
          vpc_name                   = "qa-terraform-aws-vpc"
          private_subnet_name_filter = "uat_private_*"
          public_subnet_name_filter  = "uat_public_*"
        }
        qa = {
          vpc_name                   = "qa-terraform-aws-vpc"
          private_subnet_name_filter = "qa_private_*"
          public_subnet_name_filter  = "qa_public_*"
        }
      }
    }
    887829410671 = {
      vpc_name                   = "AMP-AAS-D2"
      private_subnet_name_filter = "AMP-AAS-D2-IAPP-*"
      public_subnet_name_filter  = "AMP-AAS-D2-XDMZ-*"
    }
    554998489284 = {
      vpc_name                   = "AMP-AAS-P2"
      private_subnet_name_filter = "AMP-AAS-P2-IAPP-*"
      public_subnet_name_filter  = "AMP-AAS-P2-XDMZ-*"
    }
    969009837416 = {
      vpc_name                   = "AMP-AAS-QA"
      private_subnet_name_filter = "AMP-AAS-QA-IAPP-*"
      public_subnet_name_filter  = "AMP-AAS-QA-XDMZ-*"
    }
    058029036333 = {
      vpc_name                   = "DEL-S2"
      private_subnet_name_filter = "DEL-S2-APP-1*"
      public_subnet_name_filter  = "DEL-D-XDMZ-*"
    }
    023180329437 = {
      vpc_name                   = "DEL-P2"
      private_subnet_name_filter = "DEL-P2-APP-1*"
      public_subnet_name_filter  = "DEL-P2-IDMZ-*"
    }
    793676410512 = {
      vpc_name                   = "DEL-QA"
      private_subnet_name_filter = "DEL-QA-APP-1*"
      public_subnet_name_filter  = "DEL-QA-IDMZ-*"
    }
    156555176793 = {
      vpc_name                   = "DC-D"
      private_subnet_name_filter = "DC-D-IAPP-1*"
      public_subnet_name_filter  = "DC-D-XDMZ-*"
    }
    280383026186 = {
      vpc_name                   = "DC-P"
      private_subnet_name_filter = "DC-P-IAPP-1*"
      public_subnet_name_filter  = "DC-P-XDMZ-*"
    }
    718729873097 = {
      overrides_by_environment = {
        dev = {
          vpc_name                   = "DIGSYS-D3"
          private_subnet_name_filter = "DIGSYS-D3-IAPP-*"
          public_subnet_name_filter  = "DIGSYS-D3-XDMZ-*"
        }
        stage = {
          vpc_name                   = "DIGSYS-S3"
          private_subnet_name_filter = "DIGSYS-S3-IAPP-*"
          public_subnet_name_filter  = "DIGSYS-S3-XDMZ-*"
        }
      }
    }
    799833541840 = {
      vpc_name                   = "DIGSYS-P3"
      private_subnet_name_filter = "DIGSYS-P3-IAPP-*"
      public_subnet_name_filter  = "DIGSYS-P3-XDMZ-*"
    }
    107577002119 = {
      overrides_by_environment = {
        dev = {
          vpc_name                   = "GDS-D1"
          private_subnet_name_filter = "GDS-D1-IAPP-*"
          public_subnet_name_filter  = "GDS-D1-XDMZ-*"
        }
        uat = {
          vpc_name                   = "GDS-U1"
          private_subnet_name_filter = "GDS-U1-IAPP-*"
          public_subnet_name_filter  = "GDS-U1-XDMZ-*"
        }
      }
    }
    635220336377 = {
      vpc_name                   = "GDS-P1"
      private_subnet_name_filter = "GDS-P1-IAPP-*"
      public_subnet_name_filter  = "GDS-P1-XDMZ-*"
    }
    230315258045 = {
      overrides_by_region = {
        us-east-1 = {
          vpc_name                   = "GRPSNV-D3"
          private_subnet_name_filter = "GRPSNV-D3-EKS-*"
          public_subnet_name_filter  = "GRPSNV-D3-XDMZ-*"
        }
        eu-central-1 = {
          vpc_name                   = "GRPS-D2"
          private_subnet_name_filter = "GRPS-D2-EKS-*"
          public_subnet_name_filter  = "GRPS-D2-XDMZ-*"
        }
      }
    }
    918817604416 = {
      overrides_by_region = {
        us-east-1 = {
          vpc_name                   = "GRPS-P1"
          private_subnet_name_filter = "GRPS-P1-EKS-*"
          public_subnet_name_filter  = "GRPS-P1-XDMZ-*"
        }
        eu-central-1 = {
          vpc_name                   = "GRPS-P2"
          private_subnet_name_filter = "GRPS-P2-EKS-*"
          public_subnet_name_filter  = "GRPS-P2-XDMZ-*"
        }
      }
    }
    715641587426 = {
      vpc_name                   = "MCSEC-P1"
      private_subnet_name_filter = "MCSEC-P1-APP-*"
      public_subnet_name_filter  = "MCSEC-P1-PUB-*"
    }
    104858398257 = {
      overrides_by_environment = {
        dev = {
          vpc_name                   = "MCON-D2"
          private_subnet_name_filter = "MCON-D2-IAPP-*"
          public_subnet_name_filter  = "MCON-D2-XDMZ-*"
        }
        stage = {
          vpc_name                   = "MCDEL-S2"
          private_subnet_name_filter = "MCDEL-S2-IAPP-*"
          public_subnet_name_filter  = "MCDEL-S2-XDMZ-*"
        }
      }
    }
    638682502729 = {
      vpc_name                   = "MCDEL-P3"
      private_subnet_name_filter = "MCDEL-P3-XAPP-*"
      public_subnet_name_filter  = "MCDEL-P3-XDMZ-*"
    }
    130080192946 = {
      overrides_by_environment = {
        dev = {
          vpc_name                   = "MSRV-D2"
          private_subnet_name_filter = "MSRV-D2-APP-*"
          public_subnet_name_filter  = "MSRV-D2-PUB-*"
        }
        stage = {
          vpc_name                   = "MSRV-S2"
          private_subnet_name_filter = "MSRV-S2-APP-*"
          public_subnet_name_filter  = "MSRV-S2-PUB-*"
        }
      }
    }

    981599956623 = {
      overrides_by_environment = {
        dev = {
          vpc_name                   = "MAX-OH-S"
          private_subnet_name_filter = "MAX-OH-S-IAPP-*"
          public_subnet_name_filter  = "MAX-OH-S-IDMZ-*"
        }
        uat = {
          vpc_name                   = "MAX-U3"
          private_subnet_name_filter = "MAX-U3-IAPP-*"
          public_subnet_name_filter  = "MAX-U3-XDMZ-*"
        }
      }
    }
    504436705349 = {
      vpc_name                   = "MAX-P3"
      private_subnet_name_filter = "MAX-P3-IAPP-*"
      public_subnet_name_filter  = "MAX-P3-XDMZ-*"
    }
  }

  account_level_overrides = lookup(
    local.overrides_by_account_id,
    data.aws_caller_identity.current.account_id,
    {},
  )
  account_region_overrides = lookup(
    lookup(local.account_level_overrides, "overrides_by_region", {}),
    data.aws_region.current.region,
    {},
  )
  environment_level_overrides = lookup(
    lookup(local.account_level_overrides, "overrides_by_environment", {}),
    var.environment,
    {},
  )
  environment_region_overrides = lookup(
    lookup(local.environment_level_overrides, "overrides_by_region", {}),
    data.aws_region.current.region,
    {},
  )
  overrides = merge(
    local.account_level_overrides,
    local.account_region_overrides,
    local.environment_level_overrides,
    local.environment_region_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_*")
  private_subnets_override   = lookup(local.overrides, "private_subnets", [])
  public_subnets_override    = lookup(local.overrides, "public_subnets", [])

  current_account_id = data.aws_caller_identity.current.account_id

  # When available_ip_limit <= 0, skip IP filtering entirely.
  skip_ip_filter = var.available_ip_limit <= 0

  excluded_availability_zones = [
    "use1-az3", # doesn't support some services
  ]

  private_subnets = [
    for subnet in data.aws_subnet.private : subnet
    if(
      (local.skip_ip_filter || subnet.available_ip_address_count > var.available_ip_limit) &&
      !contains(local.excluded_availability_zones, subnet.availability_zone_id)
    )
  ]

  public_subnets = [
    for subnet in data.aws_subnet.public : subnet
    if(
      (local.skip_ip_filter || subnet.available_ip_address_count > var.available_ip_limit) &&
      !contains(local.excluded_availability_zones, subnet.availability_zone_id)
    )
  ]
}

data "aws_caller_identity" "current" {}

data "aws_region" "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(coalescelist(local.private_subnets_override, data.aws_subnets.private.ids))
  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(coalescelist(local.public_subnets_override, data.aws_subnets.public.ids))
  id       = each.value
}

data "aws_ec2_managed_prefix_lists" "private_subnets" {
  tags = {
    environment  = var.environment
    subnet_group = "all"
    tier         = "private"
    vpc_id       = data.aws_vpc.vpc.id
  }
}

data "aws_ec2_managed_prefix_list" "private_subnets" {
  count = length(data.aws_ec2_managed_prefix_lists.private_subnets.ids) > 0 ? 1 : 0
  id    = one(data.aws_ec2_managed_prefix_lists.private_subnets.ids)
}

data "aws_ec2_managed_prefix_lists" "public_subnets" {
  tags = {
    environment  = var.environment
    subnet_group = "all"
    tier         = "public"
    vpc_id       = data.aws_vpc.vpc.id
  }
}

data "aws_ec2_managed_prefix_list" "public_subnets" {
  count = length(data.aws_ec2_managed_prefix_lists.public_subnets.ids) > 0 ? 1 : 0
  id    = one(data.aws_ec2_managed_prefix_lists.public_subnets.ids)
}
