# Asset transcoding state machine.

# Policy for lambda invocation initiated by state machine.
data "aws_iam_policy_document" "assume_role_for_states_policy" {
  statement {
    actions = [
      "sts:AssumeRole",
    ]

    principals {
      type = "Service"

      identifiers = [
        "states.${var.region}.amazonaws.com",
      ]
    }
  }
}

data "aws_iam_policy_document" "invoke_lambda_policy_v2" {
  statement {
    actions = [
      "lambda:InvokeFunction",
    ]

    // will media_info when implementing metadata capture
    resources = [
      "${var.acknowledge_lambda_v2_arn}",
      "${var.encoding_route_lambda_v2_arn}",
      "${var.audio_validation_lambda_v2_arn}",
      "${var.image_validation_lambda_v2_arn}",
      "${var.image_encoding_lambda_v2_arn}",
      "${var.error_reporting_lambda_v2_arn}"
    ]
  }
}

# States role for lambda invocation
resource "aws_iam_role" "invoke_lambdas_role_by_states_role" {
  name               = "${var.environment}_invoke_lambdas_role_by_states_role"
  assume_role_policy = "${data.aws_iam_policy_document.assume_role_for_states_policy.json}"
}

# Policy that gives the state machine role permission to invoke lambdas
resource "aws_iam_role_policy" "invoke_lambda_role_policy_v2" {
  name   = "${var.environment}_invoke_lambda_role_policy_v2"
  role   = "${aws_iam_role.invoke_lambdas_role_by_states_role.id}"
  policy = "${data.aws_iam_policy_document.invoke_lambda_policy_v2.json}"
}

data "template_file" "state_machine_definition_v2" {
  template = "${file("${path.module}/${var.state_machine_definition_file}")}"

  vars {
    acknowledge_lambda_arn      = "${var.acknowledge_lambda_v2_arn}"
    encoding_route_lambda_arn   = "${var.encoding_route_lambda_v2_arn}"
    audio_validation_lambda_arn = "${var.audio_validation_lambda_v2_arn}"
    image_validation_lambda_arn = "${var.image_validation_lambda_v2_arn}"
    image_encoding_lambda_arn   = "${var.image_encoding_lambda_v2_arn}"
    error_reporting_lambda_arn  = "${var.error_reporting_lambda_v2_arn}"
  }
}

resource "aws_sfn_state_machine" "state_machine_v2" {
  name       = "${var.environment}_${var.state_machine_name}_v2"
  role_arn   = "${aws_iam_role.invoke_lambdas_role_by_states_role.arn}"
  definition = "${data.template_file.state_machine_definition_v2.rendered}"
}