data "aws_kms_alias" "default_rds" {
  name = "alias/default_rds"
}

data "aws_security_group" "sg_list" {
  for_each = toset(var.db_security_groups)
  tags     = { "Name" = each.value }
}

data "aws_rds_cluster" "original" {
  count              = var.engine_version == "" ? 1 : 0
  cluster_identifier = var.restore_from_clu_id
}

resource "aws_rds_cluster" "this" {
  cluster_identifier = var.cluster_name

  db_cluster_parameter_group_name = var.db_cluster_parameter_group_name
  db_subnet_group_name            = var.db_subnet_group

  apply_immediately                   = true
  backup_retention_period             = 1
  copy_tags_to_snapshot               = true
  iam_database_authentication_enabled = true
  skip_final_snapshot                 = true
  engine                              = "aurora-postgresql"

  vpc_security_group_ids = [for sg in data.aws_security_group.sg_list : sg.id]

  storage_encrypted = true
  kms_key_id        = var.kms_key_id != "" ? var.kms_key_id : data.aws_kms_alias.default_rds.target_key_arn


  restore_to_point_in_time {
    source_cluster_identifier  = var.restore_from_clu_id
    restore_type               = var.restore_type
    use_latest_restorable_time = true
  }

  tags = var.tags

  lifecycle {
    ignore_changes = [
      engine
    ]
  }
}

resource "aws_rds_cluster_instance" "main" {
  count                   = var.instance_count
  identifier              = "${var.cluster_name}-${count.index}"
  cluster_identifier      = aws_rds_cluster.this.id
  instance_class          = var.instance_type #"db.r5.2xlarge"
  publicly_accessible     = false
  engine                  = "aurora-postgresql"
  engine_version          = var.engine_version != "" ? var.engine_version : data.aws_rds_cluster.original[0].engine_version
  db_parameter_group_name = var.db_parameter_group_name
  db_subnet_group_name    = var.db_subnet_group
  apply_immediately       = true
  copy_tags_to_snapshot   = true
  promotion_tier          = count.index + 1
  tags                    = var.tags
}
