locals {
  password                   = var.password == "" ? random_id.password.b64_url : var.password
  create_enhanced_monitoring = var.create_resources && var.monitoring_interval > 0 ? true : false
}

resource "random_id" "password" {
  byte_length = 10
}

resource "aws_db_subnet_group" "db_subnet_group" {
  name       = "db-subnet-group"
  subnet_ids = [aws_subnet.mysql_db_a.id, aws_subnet.mysql_db_b.id]
  tags = {
    Name = "db_subnet_group"
  }
}

resource "aws_rds_cluster" "aurora_serverless_cluster" {
  cluster_identifier              = var.name
  engine                          = var.engine_name
  engine_mode                     = var.engine_mode
  engine_version                  = var.engine_version
  port                            = var.port
  master_username                 = var.username
  master_password                 = local.password
  database_name                   = var.database_name
  deletion_protection             = var.deletion_protection
  backup_retention_period         = var.backup_retention_period
  preferred_backup_window         = var.preferred_backup_window_db
  enabled_cloudwatch_logs_exports = ["audit", "error", "general", "slowquery"]
  copy_tags_to_snapshot           = var.copy_tags_to_snapshot
  skip_final_snapshot             = true
  apply_immediately               = var.apply_immediately
  vpc_security_group_ids          = [aws_security_group.db_security_group.id]
  db_subnet_group_name            = aws_db_subnet_group.db_subnet_group.id

  storage_encrypted            = var.storage_encrypted
  preferred_maintenance_window = var.preferred_maintenance_window_instance

  serverlessv2_scaling_configuration {
    max_capacity = 2.0
    min_capacity = 0.5
  }
}


resource "aws_rds_cluster_instance" "database_instance-1" {
  identifier                   = var.identifier_1
  cluster_identifier           = aws_rds_cluster.aurora_serverless_cluster.id
  instance_class               = var.cluster_instance
  engine                       = aws_rds_cluster.aurora_serverless_cluster.engine
  engine_version               = aws_rds_cluster.aurora_serverless_cluster.engine_version
  publicly_accessible          = var.publicly_accessible
  apply_immediately            = var.apply_immediately
  monitoring_role_arn          = join("", aws_iam_role.rds_enhanced_monitoring.*.arn)
  monitoring_interval          = 60
  performance_insights_enabled = var.performance_insights_enabled
  auto_minor_version_upgrade   = var.auto_minor_version_upgrade
  db_subnet_group_name         = aws_db_subnet_group.db_subnet_group.id

  tags = {
    Name = var.name
    env  = "backup"
  }

  timeouts {
    create = "2h"
    delete = "2h"
    update = "2h"
  }

}

resource "aws_rds_cluster_instance" "database_instance-2" {
  identifier                   = var.identifier_2
  cluster_identifier           = aws_rds_cluster.aurora_serverless_cluster.id
  instance_class               = var.cluster_instance
  engine                       = aws_rds_cluster.aurora_serverless_cluster.engine
  engine_version               = aws_rds_cluster.aurora_serverless_cluster.engine_version
  publicly_accessible          = var.publicly_accessible
  apply_immediately            = var.apply_immediately
  monitoring_role_arn          = join("", aws_iam_role.rds_enhanced_monitoring.*.arn)
  monitoring_interval          = 60
  performance_insights_enabled = var.performance_insights_enabled
  auto_minor_version_upgrade   = var.auto_minor_version_upgrade
  db_subnet_group_name         = aws_db_subnet_group.db_subnet_group.id

  tags = {
    Name = var.name
    env  = "backup"
  }

  timeouts {
    create = "2h"
    delete = "2h"
    update = "2h"
  }

}

data "aws_iam_policy_document" "monitoring_rds_assume_role" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["monitoring.rds.amazonaws.com"]
    }
  }
}

resource "aws_iam_role" "rds_enhanced_monitoring" {
  count              = local.create_enhanced_monitoring ? 1 : 0
  name               = "rds-enhanced-monitoring-${var.name}"
  assume_role_policy = data.aws_iam_policy_document.monitoring_rds_assume_role.json
}

resource "aws_iam_role_policy_attachment" "rds_enhanced_monitoring" {
  count      = local.create_enhanced_monitoring ? 1 : 0
  role       = aws_iam_role.rds_enhanced_monitoring[0].name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole"
}

resource "aws_db_event_subscription" "database_mysql" {
  name        = "rds-event-sub"
  sns_topic   = aws_sns_topic.topic.arn
  source_type = "db-instance"

  event_categories = [
    "availability",
    "backup",
    "configuration change",
    "creation",
    "deletion",
    "failover",
    "failure",
    "low storage",
    "maintenance",
    "read replica",
    "recovery",
    "restoration",
  ]
}