variable "event_buses" {
  description = "Map of custom EventBridge event bus definitions (the default bus is always available)"
  type = map(object({
    name               = string
    description        = optional(string, null)
    kms_key_identifier = optional(string, null)

    policy = optional(string, null)

    archive = optional(object({
      name           = string
      description    = optional(string, null)
      retention_days = optional(number, 0)
      event_pattern  = optional(string, null)
    }), null)
  }))
  default = {}
}

variable "rules" {
  description = "Map of EventBridge rule definitions"
  type = map(object({
    name                = string
    description         = optional(string, null)
    event_bus_key       = optional(string, null)
    event_bus_name      = optional(string, "default")
    state               = optional(string, "ENABLED")
    event_pattern       = optional(string, null)
    schedule_expression = optional(string, null)
    role_arn            = optional(string, null)
  }))
  default = {}
}

variable "targets" {
  description = "Map of EventBridge rule target definitions"
  type = map(object({
    rule_key       = string
    target_id      = string
    arn            = string
    role_arn       = optional(string, null)
    input          = optional(string, null)
    input_path     = optional(string, null)
    event_bus_key  = optional(string, null)
    event_bus_name = optional(string, "default")

    input_transformer = optional(object({
      input_paths    = optional(map(string), {})
      input_template = string
    }), null)

    dead_letter_config = optional(object({
      arn = string
    }), null)

    retry_policy = optional(object({
      maximum_event_age_in_seconds = optional(number, 86400)
      maximum_retry_attempts       = optional(number, 185)
    }), null)

    batch_target = optional(object({
      job_definition = string
      job_name       = string
      array_size     = optional(number, null)
      job_attempts   = optional(number, null)
    }), null)

    ecs_target = optional(object({
      task_definition_arn = string
      launch_type         = optional(string, "FARGATE")
      platform_version    = optional(string, null)
      task_count          = optional(number, 1)
      group               = optional(string, null)
      network_configuration = optional(object({
        subnets          = list(string)
        security_groups  = optional(list(string), [])
        assign_public_ip = optional(bool, false)
      }), null)
    }), null)

    sqs_target = optional(object({
      message_group_id = optional(string, null)
    }), null)
  }))
  default = {}
}

variable "connections" {
  description = "Map of EventBridge API destination connection definitions"
  type = map(object({
    name               = string
    description        = optional(string, null)
    authorization_type = string

    auth_parameters = object({
      api_key = optional(object({
        key   = string
        value = string
      }), null)
      basic = optional(object({
        username = string
        password = string
      }), null)
      oauth = optional(object({
        authorization_endpoint = string
        http_method            = string
        client_parameters = object({
          client_id     = string
          client_secret = string
        })
      }), null)
    })
  }))
  default = {}
}

variable "api_destinations" {
  description = "Map of EventBridge API destination definitions"
  type = map(object({
    name                             = string
    description                      = optional(string, null)
    connection_key                   = string
    invocation_endpoint              = string
    http_method                      = string
    invocation_rate_limit_per_second = optional(number, 300)
  }))
  default = {}
}

variable "pipes" {
  description = "Map of EventBridge Pipe definitions"
  type = map(object({
    name        = string
    description = optional(string, null)
    role_arn    = string
    source      = string
    target      = string
    state       = optional(string, "RUNNING")

    source_parameters = optional(object({
      filter_criteria = optional(object({
        filters = list(object({
          pattern = string
        }))
      }), null)
      sqs_queue_parameters = optional(object({
        batch_size                         = optional(number, null)
        maximum_batching_window_in_seconds = optional(number, null)
      }), null)
      kinesis_stream_parameters = optional(object({
        starting_position                  = optional(string, "LATEST")
        batch_size                         = optional(number, null)
        maximum_batching_window_in_seconds = optional(number, null)
        maximum_retry_attempts             = optional(number, null)
      }), null)
      dynamodb_stream_parameters = optional(object({
        starting_position                  = optional(string, "LATEST")
        batch_size                         = optional(number, null)
        maximum_batching_window_in_seconds = optional(number, null)
        maximum_retry_attempts             = optional(number, null)
      }), null)
    }), null)

    target_parameters = optional(object({
      input_template = optional(string, null)
      sqs_queue_parameters = optional(object({
        message_group_id         = optional(string, null)
        message_deduplication_id = optional(string, null)
      }), null)
      lambda_function_parameters = optional(object({
        invocation_type = optional(string, "FIRE_AND_FORGET")
      }), null)
      eventbridge_event_bus_parameters = optional(object({
        detail_type = optional(string, null)
        endpoint_id = optional(string, null)
        source      = optional(string, null)
        time        = optional(string, null)
        resources   = optional(list(string), [])
      }), null)
    }), null)
  }))
  default = {}
}

variable "tags" {
  description = "Resource tags to apply to all resources"
  type        = map(string)
  default     = {}
}
