# State machine lambda invocation policy
data "aws_iam_policy_document" "invoke_lambda_policy_awal_ingester" {
  statement {
    actions = [
      "lambda:InvokeFunction",
    ]

    resources = [
      "${data.aws_lambda_function.lambda_parse_ddex.arn}:qa",
      "${data.aws_lambda_function.lambda_validate_ddex.arn}:qa",
      "${data.aws_lambda_function.lambda_process_participants.arn}:qa",
      "${data.aws_lambda_function.lambda_set_project.arn}:qa",
      "${data.aws_lambda_function.lambda_set_product.arn}:qa",
      "${data.aws_lambda_function.lambda_retrieve_orchard_metadata.arn}:qa",
      "${data.aws_lambda_function.lambda_create_tracks.arn}:qa",
      "${data.aws_lambda_function.lambda_handle_audio_asset.arn}:qa",
      "${data.aws_lambda_function.lambda_poll_audio_asset_status.arn}:qa",
      "${data.aws_lambda_function.lambda_set_track_metadata.arn}:qa",
      "${data.aws_lambda_function.lambda_set_carveouts.arn}:qa",
      "${data.aws_lambda_function.lambda_handle_artwork.arn}:qa",
      "${data.aws_lambda_function.lambda_poll_artwork_asset_status.arn}:qa",
      "${data.aws_lambda_function.lambda_set_pricing.arn}:qa",
      "${data.aws_lambda_function.lambda_set_main_release_date.arn}:qa",
      "${data.aws_lambda_function.lambda_set_preorder_info.arn}:qa",
      "${data.aws_lambda_function.lambda_prep_ddex.arn}:qa",
      "${data.aws_lambda_function.lambda_validate_product.arn}:qa",
      "${data.aws_lambda_function.lambda_write_catalog_ingestion.arn}:qa",
      "${data.aws_lambda_function.lambda_detect_errors.arn}:qa",
      "${data.aws_lambda_function.lambda_lookup_video_product.arn}:qa",
      "${data.aws_lambda_function.lambda_handle_video_asset.arn}:qa",
      "${data.aws_lambda_function.lambda_poll_video_asset_status.arn}:qa",
      "${data.aws_lambda_function.lambda_set_video_metadata.arn}:qa",
      "${data.aws_lambda_function.lambda_create_video.arn}:qa",
      "${data.aws_lambda_function.lambda_fix_video_resolution.arn}:qa",
      "${data.aws_lambda_function.lambda_import_delivery_history_from_ext_ddex.arn}:qa",
      "${data.aws_lambda_function.lambda_handle_purged_release.arn}:qa",
      "${data.aws_lambda_function.lambda_set_release_correction.arn}:qa",
      "${data.aws_lambda_function.lambda_submit_product.arn}:qa",
    ]
  }
}

# Step Function (SFN) machine definition template - SME Marketing Ingester
data "template_file" "sfn_awal_ingester_definition" {
  template = file("${path.module}/${var.sfn_awal_ingester_definition_file}")
  vars = {
    account_id                                       = data.aws_caller_identity.current.account_id,
    region                                           = var.region
    environment                                      = var.environment
    filename_pattern                                 = var.sentinel_file
    lambda_parse_ddex_arn                            = data.aws_lambda_function.lambda_parse_ddex.arn
    lambda_validate_ddex_arn                         = data.aws_lambda_function.lambda_validate_ddex.arn
    lambda_process_participants_arn                  = data.aws_lambda_function.lambda_process_participants.arn
    lambda_set_project_arn                           = data.aws_lambda_function.lambda_set_project.arn
    lambda_set_product_arn                           = data.aws_lambda_function.lambda_set_product.arn
    lambda_retrieve_orchard_metadata_arn             = data.aws_lambda_function.lambda_retrieve_orchard_metadata.arn
    lambda_create_tracks_arn                         = data.aws_lambda_function.lambda_create_tracks.arn
    lambda_handle_audio_asset_arn                    = data.aws_lambda_function.lambda_handle_audio_asset.arn
    lambda_poll_audio_asset_status_arn               = data.aws_lambda_function.lambda_poll_audio_asset_status.arn
    lambda_set_track_metadata_arn                    = data.aws_lambda_function.lambda_set_track_metadata.arn
    lambda_set_carveouts_arn                         = data.aws_lambda_function.lambda_set_carveouts.arn
    lambda_handle_artwork_arn                        = data.aws_lambda_function.lambda_handle_artwork.arn
    lambda_poll_artwork_asset_status_arn             = data.aws_lambda_function.lambda_poll_artwork_asset_status.arn
    lambda_set_pricing_arn                           = data.aws_lambda_function.lambda_set_pricing.arn
    lambda_set_main_release_date_arn                 = data.aws_lambda_function.lambda_set_main_release_date.arn
    lambda_set_preorder_info_arn                     = data.aws_lambda_function.lambda_set_preorder_info.arn
    lambda_prep_ddex_arn                             = data.aws_lambda_function.lambda_prep_ddex.arn
    lambda_validate_product_arn                      = data.aws_lambda_function.lambda_validate_product.arn
    lambda_write_catalog_ingestion_arn               = data.aws_lambda_function.lambda_write_catalog_ingestion.arn
    lambda_detect_errors_arn                         = data.aws_lambda_function.lambda_detect_errors.arn
    lambda_lookup_video_product_arn                  = data.aws_lambda_function.lambda_lookup_video_product.arn
    lambda_handle_video_asset_arn                    = data.aws_lambda_function.lambda_handle_video_asset.arn
    lambda_poll_video_asset_status_arn               = data.aws_lambda_function.lambda_poll_video_asset_status.arn
    lambda_set_video_metadata_arn                    = data.aws_lambda_function.lambda_set_video_metadata.arn
    lambda_create_video_arn                          = data.aws_lambda_function.lambda_create_video.arn
    lambda_fix_video_resolution_arn                  = data.aws_lambda_function.lambda_fix_video_resolution.arn
    lambda_import_delivery_history_from_ext_ddex_arn = data.aws_lambda_function.lambda_import_delivery_history_from_ext_ddex.arn
    lambda_handle_purged_release_arn                 = data.aws_lambda_function.lambda_handle_purged_release.arn
    lambda_set_release_correction_arn                = data.aws_lambda_function.lambda_set_release_correction.arn
    lambda_submit_product_arn                        = data.aws_lambda_function.lambda_submit_product.arn
  }
}

# Step Function (SFN) root role - Role creation using policy definition
resource "aws_iam_role" "sfn_awal_ingester_role" {
  name               = "${var.environment}-awal-ingester-sfn-role"
  description        = "Governing role for ${var.environment}-awal-ingester-sfn execution and resource access."
  assume_role_policy = data.aws_iam_policy_document.sfn_assume_statemachines_role.json
}

# Policy that gives the state machine role permission to invoke lambdas
resource "aws_iam_role_policy" "sfn_awal_ingester_invoke_lambda_role_policy" {
  name   = "${var.environment}-awal-ingester-lambda-role-policy"
  role   = aws_iam_role.sfn_awal_ingester_role.id
  policy = data.aws_iam_policy_document.invoke_lambda_policy_awal_ingester.json
}

# Policy xray
resource "aws_iam_role_policy" "sfn_awal_ingester_xray_policy_document" {
  name   = "${var.environment}-awal-ingester-xray-role-policy"
  role   = aws_iam_role.sfn_awal_ingester_role.id
  policy = data.aws_iam_policy_document.sfn_ddex_ingester_xray_policy_document.json
}

# Step Function (SFN) - SFN LogEvent - Policy creation using policy definition document
resource "aws_iam_policy" "sfn_awal_ingester_log_event_policy" {
  name        = "${var.environment}-awal-ingester-sfn-logevent-policy"
  description = "Shared SFN LogEvent Policy for awal ingester sfn services."
  policy      = data.aws_iam_policy_document.ddex_ingester_log_event_policy_document.json
}

# Attach Step Function (SFN) LogEvent Policy to various root roles sme-marketing-ingester
resource "aws_iam_role_policy_attachment" "sfn_awal_ingester_log_event_policy_attachment" {
  role       = aws_iam_role.sfn_awal_ingester_role.name
  policy_arn = aws_iam_policy.sfn_awal_ingester_log_event_policy.arn
}

# Step Function (SFN) definition for marketing ingest
resource "aws_sfn_state_machine" "sfn_awal_ingester" {
  name       = "${var.environment}-awal-ingester-sfn"
  role_arn   = aws_iam_role.sfn_awal_ingester_role.arn
  definition = data.template_file.sfn_awal_ingester_definition.rendered

  tags = {
    application_family = var.application_family
    environment        = var.environment
    service_name       = "awal-ingester-sfn"
    terraformed        = true
  }

  tracing_configuration {
    enabled = true
  }
}
