data "aws_caller_identity" "current" {}

locals {
  name            = "${var.env_prefix}-${var.project_group}"
  master_password = var.master_password == "" ? random_password.master_password.result : var.master_password
  apply_method    = var.apply_immediately == true ? "immediate" : "pending-reboot"
}

resource "random_password" "master_password" {
  length           = 24
  special          = true
  override_special = "!#$%&*-_=+[]{}<>:?"
}

resource "aws_docdb_cluster" "main" {
  engine_version                  = var.engine_version
  cluster_identifier              = local.name
  engine                          = "docdb"
  storage_encrypted               = true
  master_username                 = var.master_username
  master_password                 = local.master_password
  backup_retention_period         = var.backup_retention_period
  preferred_backup_window         = var.preferred_backup_window
  db_subnet_group_name            = aws_docdb_subnet_group.main.name
  db_cluster_parameter_group_name = aws_docdb_cluster_parameter_group.main.name
  vpc_security_group_ids          = var.vpc_security_group_ids
  skip_final_snapshot             = var.skip_final_snapshot
  apply_immediately               = var.apply_immediately
  tags                            = var.common_tags
  enabled_cloudwatch_logs_exports = var.enabled_cloudwatch_logs_exports

  lifecycle {
    ignore_changes = [master_password]
  }
}

resource "aws_docdb_subnet_group" "main" {
  name       = local.name
  subnet_ids = var.subnet_ids
  tags       = var.common_tags
}

resource "aws_docdb_cluster_parameter_group" "main" {
  family = "docdb3.6"
  name   = local.name

  dynamic "parameter" {
    for_each = var.parameters
    content {
      name         = lookup(parameter.value, "name")
      value        = lookup(parameter.value, "value")
      apply_method = lookup(parameter.value, "apply_method", "pending-reboot")
    }
  }
}

resource "aws_docdb_cluster_instance" "main_instances" {
  count              = var.instance_count
  identifier         = "${local.name}-node${format("%02d", (count.index + 1))}"
  cluster_identifier = aws_docdb_cluster.main.id
  instance_class     = var.instance_type
  apply_immediately  = var.apply_immediately
  tags               = var.common_tags
}
