
data "aws_caller_identity" "current" {}

data "aws_sqs_queue" "source_queue" {
  name = "${var.environment}-hello-world-sqs"
}

data "aws_sfn_state_machine" "existing_sfn" {
  name = "${var.environment}-asset-transcoder-state-machine"
}

data "aws_iam_policy_document" "eventbridge_pipe_assume_role_policy" {
  statement {
    effect = "Allow"
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["pipes.amazonaws.com"]
    }

    condition {
      test     = "StringEquals"
      variable = "aws:SourceAccount"
      values   = [data.aws_caller_identity.current.account_id]
    }
  }
}

resource "aws_iam_role" "eventbridge_pipe_role" {
  assume_role_policy = data.aws_iam_policy_document.eventbridge_pipe_assume_role_policy.json
}

data "aws_iam_policy_document" "eventbridge_pipe_sqs_source_policy" {
  statement {
    effect = "Allow"
    actions = [
      "sqs:DeleteMessage",
      "sqs:GetQueueAttributes",
      "sqs:ReceiveMessage",
    ]
    resources = [
      data.aws_sqs_queue.source_queue.arn
    ]
  }
}

resource "aws_iam_role_policy" "eventbridge_pipe_sqs_source_policy" {
  role   = aws_iam_role.eventbridge_pipe_role.id
  policy = data.aws_iam_policy_document.eventbridge_pipe_sqs_source_policy.json
}

data "aws_iam_policy_document" "eventbridge_pipe_sfn_target_policy" {
  statement {
    effect = "Allow"
    actions = [
      "states:StartExecution",
    ]
    resources = [
      data.aws_sfn_state_machine.existing_sfn.arn
    ]
  }
}

resource "aws_iam_role_policy" "eventbridge_pipe_sfn_target_policy" {
  role   = aws_iam_role.eventbridge_pipe_role.id
  policy = data.aws_iam_policy_document.eventbridge_pipe_sfn_target_policy.json
}

resource "aws_pipes_pipe" "eventbridge_pipe" {
  name       = "${var.environment}-${var.service_name}-pipe"
  role_arn   = aws_iam_role.eventbridge_pipe_role.arn
  source     = data.aws_sqs_queue.source_queue.arn
  target     = data.aws_sfn_state_machine.existing_sfn.arn

  source_parameters {
    sqs_queue_parameters {
      batch_size                         = 1
      maximum_batching_window_in_seconds = 5
    }
  }

  target_parameters {
    step_function_state_machine_parameters {
      invocation_type = "FIRE_AND_FORGET" # or REQUEST_RESPONSE
    }
  }
}
