resource "google_project_service" "compute" {
  project            = var.gcp_project_id
  service            = "compute.googleapis.com"
  disable_on_destroy = false
}

resource "google_project_service" "storage" {
  project            = var.gcp_project_id
  service            = "storage.googleapis.com"
  disable_on_destroy = false
}

resource "google_compute_network" "this" {
  name                    = "${local.deployment_name}-vpc"
  auto_create_subnetworks = false
  description             = "usedby=${local.deployment_name}; managed-by=terraform; purpose=date-integration-test"
  project                 = var.gcp_project_id
  depends_on              = [google_project_service.compute]
}

resource "google_compute_subnetwork" "services" {
  name                     = "${local.deployment_name}-services"
  region                   = var.gcp_region
  network                  = google_compute_network.this.id
  ip_cidr_range            = cidrsubnet(var.vpc_cidr, 4, 0)
  private_ip_google_access = true
  description              = "usedby=${local.deployment_name}; tier=public-services"
}

resource "google_compute_subnetwork" "psc" {
  name          = "${local.deployment_name}-psc"
  region        = var.gcp_region
  network       = google_compute_network.this.id
  ip_cidr_range = cidrsubnet(var.vpc_cidr, 4, 1)
  purpose       = "PRIVATE_SERVICE_CONNECT"
  description   = "usedby=${local.deployment_name}; purpose=psc-nat-mysql-kafka"
}

resource "google_compute_firewall" "psc_and_health_checks" {
  name        = "${local.deployment_name}-psc-health"
  network     = google_compute_network.this.name
  description = "usedby=${local.deployment_name}; PSC NAT and Google health checks"
  direction   = "INGRESS"
  source_ranges = [
    google_compute_subnetwork.psc.ip_cidr_range,
    "35.191.0.0/16",
    "130.211.0.0/22",
  ]
  target_tags = [local.deployment_name]

  allow {
    protocol = "tcp"
    ports = [
      tostring(local.ports.mysql),
      tostring(local.ports.kafka_pl_public),
      tostring(local.ports.kafka_pl_sasl),
    ]
  }
}

resource "google_compute_address" "public" {
  name         = "${local.deployment_name}-public"
  project      = var.gcp_project_id
  region       = var.gcp_region
  address_type = "EXTERNAL"
  description  = "usedby=${local.deployment_name}; fixed service address"
  labels       = local.labels
}
