# Default region
provider "aws" {
  region = "us-west-2"
}

variable "network_name" {
  type    = string
  default = "dev"
}

variable "fleet_name" {
  type    = string
  default = "dev"
}

variable "name" {
  type    = string
  default = "cloud"
}

# AMIs
variable "api_ami" {
  type    = string
  default = "ami-03aa99ddf5498ceb9" # Ubuntu 24 Base
}

variable "admin_api_ami" {
  type    = string
  default = "ami-03aa99ddf5498ceb9" # Ubuntu 24 Base
}

variable "cloud_api_ami" {
  type    = string
  default = "ami-03aa99ddf5498ceb9" # Ubuntu 24 Base
}

variable "cloud_websocket_ami" {
  type    = string
  default = "ami-03aa99ddf5498ceb9" # Ubuntu 24 Base
}

variable "webapps_ami" {
  type    = string
  default = "ami-03aa99ddf5498ceb9" # Ubuntu 24 Base
}

variable "use_placement_group_for_webapps" {
  type    = string
  default = "0"
}

# Instance types
variable "api_instance_type" {
  type    = string
  default = "t2.micro"
}

variable "admin_api_instance_type" {
  type    = string
  default = "t2.micro"
}

variable "cloud_api_instance_type" {
  type    = string
  default = "t2.micro"
}

variable "cloud_websocket_instance_type" {
  type    = string
  default = "t2.micro"
}

variable "webapps_instance_type" {
  type    = string
  default = "t2.micro"
}

# Key names - private key file deployed to the server.
variable "api_key_name" {
  type    = string
  default = "dev_cloud"
}

variable "admin_api_key_name" {
  type    = string
  default = "dev_cloud"
}

variable "cloud_api_key_name" {
  type    = string
  default = "dev_cloud"
}

variable "cloud_websocket_key_name" {
  type    = string
  default = "dev_cloud"
}

variable "webapps_key_name" {
  type    = string
  default = "dev_cloud"
}

# Certificate ARNs
variable "api_elb_certificate_arn" {
  type    = string
  default = "arn:aws:acm:us-west-2:164780942622:certificate/61f977f7-27ff-4538-861c-dfb6535a8f80"
}

variable "admin_api_elb_certificate_arn" {
  type    = string
  default = "arn:aws:acm:us-west-2:164780942622:certificate/61f977f7-27ff-4538-861c-dfb6535a8f80"
}

variable "cloud_api_elb_certificate_arn" {
  type    = string
  default = "arn:aws:acm:us-west-2:164780942622:certificate/61f977f7-27ff-4538-861c-dfb6535a8f80"
}

variable "cloud_websocket_elb_certificate_arn" {
  type    = string
  default = "arn:aws:acm:us-west-2:164780942622:certificate/61f977f7-27ff-4538-861c-dfb6535a8f80"
}

variable "webapps_elb_certificate_arn" {
  type    = string
  default = "arn:aws:acm:us-west-2:164780942622:certificate/61f977f7-27ff-4538-861c-dfb6535a8f80"
}

# Placement group
resource "aws_placement_group" "cloud_placement_group" {
  name     = "${var.network_name}_${var.fleet_name}_placement_group"
  strategy = "cluster"
}

module "api" {
  source              = "./api"
  network_name        = var.network_name
  fleet_name          = var.fleet_name
  ami                 = var.api_ami
  key_name            = var.api_key_name
  instance_type       = var.api_instance_type
  elb_certificate_arn = var.api_elb_certificate_arn
}

module "admin_api" {
  source              = "./admin_api"
  network_name        = var.network_name
  fleet_name          = var.fleet_name
  ami                 = var.admin_api_ami
  key_name            = var.admin_api_key_name
  instance_type       = var.admin_api_instance_type
  elb_certificate_arn = var.admin_api_elb_certificate_arn
  webapps_eip         = module.webapps.webapps_eip
}

module "cloud_api" {
  source              = "./cloud_api"
  network_name        = var.network_name
  fleet_name          = var.fleet_name
  name                = "cloud_api"
  ami                 = var.cloud_api_ami
  key_name            = var.cloud_api_key_name
  instance_type       = var.cloud_api_instance_type
  elb_certificate_arn = var.cloud_api_elb_certificate_arn
}

module "cloud_websocket" {
  source                              = "./cloud_websocket"
  network_name                        = var.network_name
  fleet_name                          = var.fleet_name
  name                                = "cloud_websocket"
  ami                                 = var.cloud_websocket_ami
  key_name                            = var.cloud_websocket_key_name
  instance_type                       = var.cloud_websocket_instance_type
  cloud_websocket_elb_certificate_arn = var.cloud_websocket_elb_certificate_arn
}

module "webapps" {
  source              = "./webapps"
  network_name        = var.network_name
  fleet_name          = var.fleet_name
  ami                 = var.webapps_ami
  key_name            = var.webapps_key_name
  instance_type       = var.webapps_instance_type
  elb_certificate_arn = var.webapps_elb_certificate_arn
  placement_group     = var.use_placement_group_for_webapps == "1" ? "${var.network_name}_${var.fleet_name}_placement_group" : null
}

output "api" {
  value = module.api
}

output "admin_api" {
  value = module.admin_api
}

output "cloud_api" {
  value = module.cloud_api
}

output "cloud_websocket" {
  value = module.cloud_websocket
}

output "webapps" {
  value = module.webapps
}
