data "aws_availability_zones" "all" {
}

# Network VPC, gateway, and routes

resource "aws_vpc" "network" {
  cidr_block                       = var.host_cidr
  assign_generated_ipv6_cidr_block = true
  enable_dns_support               = true
  enable_dns_hostnames             = true

  tags = {
    "Name" = var.cluster_name
  }
}

resource "aws_internet_gateway" "gateway" {
  vpc_id = aws_vpc.network.id

  tags = {
    "Name" = var.cluster_name
  }
}

resource "aws_route_table" "default" {
  vpc_id = aws_vpc.network.id

  tags = {
    "Name" = var.cluster_name
  }
}

resource "aws_route" "egress-ipv4" {
  route_table_id         = aws_route_table.default.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.gateway.id
}

resource "aws_route" "egress-ipv6" {
  route_table_id              = aws_route_table.default.id
  destination_ipv6_cidr_block = "::/0"
  gateway_id                  = aws_internet_gateway.gateway.id
}

# Subnets (one per availability zone)

resource "aws_subnet" "public" {
  count = length(data.aws_availability_zones.all.names)

  vpc_id            = aws_vpc.network.id
  availability_zone = data.aws_availability_zones.all.names[count.index]

  cidr_block                      = cidrsubnet(var.host_cidr, 4, count.index)
  ipv6_cidr_block                 = cidrsubnet(aws_vpc.network.ipv6_cidr_block, 8, count.index)
  map_public_ip_on_launch         = true
  assign_ipv6_address_on_creation = true

  tags = {
    "Name" = "${var.cluster_name}-public-${count.index}"
  }
}

resource "aws_route_table_association" "public" {
  count = length(data.aws_availability_zones.all.names)

  route_table_id = aws_route_table.default.id
  subnet_id      = aws_subnet.public.*.id[count.index]
}