resource "aws_elasticache_subnet_group" "sg" {
  for_each   = local.standard_cache_instances
  name       = "${each.value.name}-subnet-group"
  subnet_ids = each.value.subnet_ids

  tags = merge(var.service_tags, {
    Name = "${each.value.name}-subnet-group"
  })
}

resource "aws_elasticache_parameter_group" "pg" {
  for_each = local.standard_cache_instances
  name     = "${each.value.name}-parameter-group"
  family   = each.value.family

  tags = merge(var.service_tags, {
    Name = "${each.value.name}-parameter-group"
  })
}

resource "aws_elasticache_replication_group" "elasticache" {
  for_each                   = local.standard_cache_instances
  replication_group_id       = each.value.name
  description                = each.value.name
  engine                     = each.value.engine
  node_type                  = each.value.node_type
  num_cache_clusters         = each.value.num_cache_clusters
  snapshot_retention_limit   = each.value.snapshot_retention_limit
  parameter_group_name       = aws_elasticache_parameter_group.pg[each.value.name].name
  engine_version             = each.value.engine_version
  port                       = each.value.port
  at_rest_encryption_enabled = each.value.at_rest_encryption_enabled
  subnet_group_name          = aws_elasticache_subnet_group.sg[each.value.name].name
  security_group_ids         = each.value.security_group_ids
  apply_immediately          = each.value.apply_immediately

  log_delivery_configuration {
    destination      = aws_cloudwatch_log_group.lg[each.value.name].name
    destination_type = "cloudwatch-logs"
    log_format       = "json"
    log_type         = "engine-log"
  }

  depends_on = [
    aws_elasticache_subnet_group.sg,
    aws_elasticache_parameter_group.pg
  ]

  tags = merge(var.service_tags, {
    Name = each.value.name
  })
}

resource "aws_cloudwatch_log_group" "lg" {
  for_each          = local.standard_cache_instances
  name              = "${each.value.name}-log-group"
  retention_in_days = each.value.log_group_retention_in_days

  tags = merge(var.service_tags, {
    Name = "${each.value.name}-log-group"
  })
}
