locals {
  port                 = var.port == "" ? var.engine == "aurora-postgresql" ? "5432" : "3306" : var.port
  master_password      = var.password == "" ? random_password.master_password.result : var.password
  master_instance_type = var.master_instance_type == "" ? var.instance_type : var.master_instance_type
}

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

resource "aws_rds_cluster" "this" {
  global_cluster_identifier           = var.global_cluster_identifier
  cluster_identifier                  = "${var.name_prefix}-${var.name}"
  engine                              = var.engine
  engine_mode                         = var.engine_mode
  engine_version                      = var.engine_version
  kms_key_id                          = var.kms_key_id
  database_name                       = var.database_name
  master_username                     = var.username
  master_password                     = local.master_password
  final_snapshot_identifier           = "${var.name_prefix}-${var.name}-${var.final_snapshot_identifier_prefix}-${random_id.snapshot_identifier.hex}"
  skip_final_snapshot                 = var.skip_final_snapshot
  deletion_protection                 = var.deletion_protection
  backup_retention_period             = var.backup_retention_period
  preferred_backup_window             = var.preferred_backup_window
  preferred_maintenance_window        = var.preferred_maintenance_window
  port                                = local.port
  db_subnet_group_name                = var.db_subnet_group_name
  vpc_security_group_ids              = var.security_groups
  snapshot_identifier                 = var.snapshot_identifier
  storage_encrypted                   = var.storage_encrypted
  apply_immediately                   = var.apply_immediately
  allow_major_version_upgrade         = var.allow_major_version_upgrade
  db_cluster_parameter_group_name     = var.db_cluster_parameter_group_name
  iam_database_authentication_enabled = var.iam_database_authentication_enabled
  copy_tags_to_snapshot               = var.copy_tags_to_snapshot

  enabled_cloudwatch_logs_exports = var.enabled_cloudwatch_logs_exports

  tags = merge(var.common_tags, { Name = "${var.name_prefix}-${var.name}" })
  lifecycle {
    ignore_changes = [
      snapshot_identifier,
      master_password,
      iam_roles,
    ]
  }
}

resource "aws_rds_cluster_role_association" "this" {
  for_each              = var.iam_role_assosiations
  db_cluster_identifier = aws_rds_cluster.this.id
  feature_name          = each.key
  role_arn              = each.value
}

resource "aws_rds_cluster_instance" "this" {
  count = var.instance_count

  identifier                      = "${var.name_prefix}-${var.name}-instance-${count.index + 1}"
  cluster_identifier              = aws_rds_cluster.this.id
  engine                          = var.engine
  engine_version                  = var.engine_version
  instance_class                  = count.index == 0 ? local.master_instance_type : var.instance_type
  availability_zone               = length(coalesce(var.availability_zones, [])) != 0 ? var.availability_zones[count.index] : null
  publicly_accessible             = var.publicly_accessible
  db_subnet_group_name            = var.db_subnet_group_name
  db_parameter_group_name         = var.db_parameter_group_name
  preferred_maintenance_window    = var.preferred_maintenance_window
  apply_immediately               = var.apply_immediately
  monitoring_role_arn             = var.monitoring_role_arn
  monitoring_interval             = var.monitoring_interval
  auto_minor_version_upgrade      = var.auto_minor_version_upgrade
  promotion_tier                  = count.index + 1
  performance_insights_enabled    = var.performance_insights_enabled
  performance_insights_kms_key_id = var.performance_insights_kms_key_id
  copy_tags_to_snapshot           = var.copy_tags_to_snapshot

  tags = merge(var.common_tags, { Name = "${var.name_prefix}-${var.name}" })

  lifecycle {
    ignore_changes = [engine_version]
  }
}

resource "random_id" "snapshot_identifier" {
  byte_length = 4
}
