# Redshift subnet groups ======================================================

resource "aws_redshift_subnet_group" "this" {
  for_each = var.subnet_groups

  name        = each.value.name
  description = each.value.description
  subnet_ids  = each.value.subnet_ids

  tags = local.tags
}

# Redshift parameter groups ===================================================

resource "aws_redshift_parameter_group" "this" {
  for_each = var.parameter_groups

  name        = each.value.name
  family      = each.value.family
  description = each.value.description

  dynamic "parameter" {
    for_each = each.value.parameters
    content {
      name  = parameter.key
      value = parameter.value
    }
  }

  tags = local.tags
}

# Redshift clusters ===========================================================

resource "aws_redshift_cluster" "this" {
  for_each = var.clusters

  cluster_identifier     = each.value.cluster_identifier
  database_name          = each.value.database_name
  master_username        = each.value.master_username
  manage_master_password = true

  node_type       = each.value.node_type
  cluster_type    = each.value.cluster_type
  number_of_nodes = each.value.cluster_type == "single-node" ? null : each.value.number_of_nodes
  port            = each.value.port

  allow_version_upgrade = each.value.allow_version_upgrade
  publicly_accessible   = each.value.publicly_accessible
  encrypted             = each.value.encrypted
  kms_key_id            = each.value.kms_key_id
  enhanced_vpc_routing  = each.value.enhanced_vpc_routing

  availability_zone                    = each.value.availability_zone
  availability_zone_relocation_enabled = each.value.availability_zone_relocation_enabled

  automated_snapshot_retention_period = each.value.automated_snapshot_retention_period
  preferred_maintenance_window        = each.value.preferred_maintenance_window

  skip_final_snapshot       = each.value.skip_final_snapshot
  final_snapshot_identifier = each.value.skip_final_snapshot ? null : coalesce(each.value.final_snapshot_identifier, "${each.value.cluster_identifier}-final")

  snapshot_cluster_identifier = each.value.snapshot_cluster_identifier
  snapshot_identifier         = each.value.snapshot_identifier

  iam_roles                    = each.value.iam_roles
  cluster_subnet_group_name    = each.value.subnet_group_name != null ? each.value.subnet_group_name : (length(var.subnet_groups) > 0 ? aws_redshift_subnet_group.this[keys(var.subnet_groups)[0]].name : null)
  cluster_parameter_group_name = each.value.parameter_group_name != null ? each.value.parameter_group_name : (length(var.parameter_groups) > 0 ? aws_redshift_parameter_group.this[keys(var.parameter_groups)[0]].name : null)
  vpc_security_group_ids       = each.value.vpc_security_group_ids

  tags = local.tags
}

# Redshift cluster logging ====================================================

resource "aws_redshift_logging" "this" {
  for_each = {
    for k, v in var.clusters : k => v
    if v.logging != null && v.logging.enable
  }

  cluster_identifier   = aws_redshift_cluster.this[each.key].id
  log_destination_type = "s3"
  bucket_name          = each.value.logging.bucket_name
  s3_key_prefix        = each.value.logging.s3_key_prefix
}

# Redshift scheduled actions ==================================================

resource "aws_redshift_scheduled_action" "this" {
  for_each = var.scheduled_actions

  name     = each.value.name
  schedule = each.value.schedule
  iam_role = each.value.iam_role_arn
  target_action {
    dynamic "pause_cluster" {
      for_each = each.value.action_type == "pause" ? [true] : []
      content {
        cluster_identifier = aws_redshift_cluster.this[each.value.cluster_key].cluster_identifier
      }
    }

    dynamic "resume_cluster" {
      for_each = each.value.action_type == "resume" ? [true] : []
      content {
        cluster_identifier = aws_redshift_cluster.this[each.value.cluster_key].cluster_identifier
      }
    }

    dynamic "resize_cluster" {
      for_each = each.value.action_type == "resize" && each.value.resize != null ? [each.value.resize] : []
      content {
        cluster_identifier = aws_redshift_cluster.this[each.value.cluster_key].cluster_identifier
        node_type          = resize_cluster.value.node_type
        number_of_nodes    = resize_cluster.value.number_of_nodes
        cluster_type       = resize_cluster.value.cluster_type
      }
    }
  }
}
