# SSM documents ==============================================================

resource "aws_ssm_document" "this" {
  for_each = var.documents

  name            = each.value.name
  document_type   = each.value.document_type
  document_format = each.value.document_format
  content         = each.value.content
  target_type     = each.value.target_type
  version_name    = each.value.version_name

  permissions = each.value.permissions != null ? {
    type        = "Share"
    account_ids = join(",", each.value.permissions.account_ids)
  } : null

  tags = local.tags
}

# Maintenance windows ========================================================

resource "aws_ssm_maintenance_window" "this" {
  for_each = var.maintenance_windows

  name                       = each.value.name
  description                = each.value.description
  schedule                   = each.value.schedule
  duration                   = each.value.duration
  cutoff                     = each.value.cutoff
  allow_unassociated_targets = each.value.allow_unassociated_targets
  schedule_timezone          = each.value.schedule_timezone

  tags = local.tags
}

# Maintenance window targets -------------------------------------------------

resource "aws_ssm_maintenance_window_target" "this" {
  for_each = var.maintenance_window_targets

  window_id         = aws_ssm_maintenance_window.this[each.value.window_key].id
  resource_type     = each.value.resource_type
  owner_information = each.value.owner_information

  targets {
    key    = each.value.target_key
    values = each.value.target_values
  }
}

# Maintenance window tasks ---------------------------------------------------

resource "aws_ssm_maintenance_window_task" "this" {
  for_each = var.maintenance_window_tasks

  window_id        = aws_ssm_maintenance_window.this[each.value.window_key].id
  task_type        = each.value.task_type
  task_arn         = each.value.task_arn
  service_role_arn = each.value.service_role_arn
  priority         = each.value.priority
  max_concurrency  = each.value.max_concurrency
  max_errors       = each.value.max_errors

  targets {
    key    = "WindowTargetIds"
    values = [aws_ssm_maintenance_window_target.this[each.value.target_key].id]
  }

  dynamic "task_invocation_parameters" {
    for_each = each.value.run_command_parameters != null ? [each.value.run_command_parameters] : []
    content {
      run_command_parameters {
        document_version = task_invocation_parameters.value.document_version
        output_s3_bucket = task_invocation_parameters.value.output_s3_bucket

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

# Patch baselines ============================================================

resource "aws_ssm_patch_baseline" "this" {
  for_each = var.patch_baselines

  name             = each.value.name
  description      = each.value.description
  operating_system = each.value.operating_system

  approved_patches = each.value.approved_patches
  rejected_patches = each.value.rejected_patches

  dynamic "approval_rule" {
    for_each = each.value.approval_rules
    content {
      approve_after_days = approval_rule.value.approve_after_days
      compliance_level   = approval_rule.value.compliance_level

      dynamic "patch_filter" {
        for_each = approval_rule.value.patch_filter_groups
        content {
          key    = keys(patch_filter.value)[0]
          values = values(patch_filter.value)[0]
        }
      }
    }
  }

  tags = local.tags
}
