/**
 * Copyright 2023 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

variable "backend_vm_configs" {
  description = "The sample backend VMs configuration. Keys are the zones where VMs are deployed."
  type = map(object({
    address        = string
    instance_type  = string
    startup_script = string
  }))
  default = {
    a = {
      address        = "192.168.100.101"
      instance_type  = "e2-micro"
      startup_script = "apt update && apt install -y nginx"
    }
    b = {
      address        = "192.168.100.102"
      instance_type  = "e2-micro"
      startup_script = "apt update && apt install -y nginx"
    }
  }
}

variable "forwarding_rules_config" {
  type        = map(any)
  description = "The optional configurations of the GCP load balancers forwarding rules."
  default = {
    "ipv4" = {
      address  = "192.168.100.100"
      protocol = "TCP"
    }
    "ipv6" = {
      ip_version = "IPV6"
    }
  }
}

variable "instance_dedicated_configs" {
  description = "The F5 VMs configuration. The map keys are the zones where the VMs are deployed."
  type        = map(any)
  default = {
    a = {
      license_key = "AAAAA-BBBBB-CCCCC-DDDDD-EEEEEEE"
      network_config = {
        alias_ip_range_address = "192.168.101.0/24"
        alias_ip_range_name    = "f5-a"
      }
    }
    b = {
      license_key = "AAAAA-BBBBB-CCCCC-DDDDD-EEEEEEE"
      network_config = {
        alias_ip_range_address = "192.168.102.0/24"
        alias_ip_range_name    = "f5-b"
      }
    }
  }
}

variable "instance_shared_config" {
  description = "The F5 VMs shared configurations."
  type        = map(any)
  default = {
    enable_ipv6    = true
    ssh_public_key = "./data/mykey.pub"
  }
}

variable "prefix" {
  type        = string
  description = "The name prefix used for resources."
}

variable "project_create" {
  description = "Whether to automatically create a project."
  type        = bool
  default     = false
}

variable "project_id" {
  type        = string
  description = "The project id where we deploy the resources."
}

variable "region" {
  type        = string
  description = "The region where we deploy the F5 IPs."
}

variable "vpc_config" {
  description = "VPC and subnet ids, in case existing VPCs are used."
  type = object({
    backend_vms_cidr = string # used by F5s. Not configured on the VPC.
    dataplane = object({
      subnets = map(object({
        cidr                = optional(string)
        secondary_ip_ranges = optional(map(string)) # name -> cidr
      }))
    })
    management = object({
      subnets = map(object({
        cidr                = optional(string)
        secondary_ip_ranges = optional(map(string)) # name -> cidr
      }))
    })
  })
  default = {
    backend_vms_cidr = "192.168.200.0/24"
    dataplane = {
      subnets = {
        clients = {
          cidr = "192.168.0.0/24"
        }
        dataplane = {
          cidr = "192.168.100.0/24"
          secondary_ip_ranges = {
            f5-a = "192.168.101.0/24"
            f5-b = "192.168.102.0/24"
          }
        }
      }
    }
    management = {
      subnets = {
        management = {
          cidr = "192.168.250.0/24"
        }
      }
    }
  }
}
