data "aws_iam_policy_document" "assume_statemachines_role" {
  statement {
    actions = ["sts:AssumeRole"]

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

data "aws_iam_policy_document" "daemon_video_stepfunctions_policy_document" {
  statement {
    effect = "Allow"

    actions = [
      "states:GetActivityTask",
      "states:SendTaskHeartbeat",
      "states:SendTaskSuccess",
      "states:SendTaskFailure",
    ]

    resources = [
      "*",
    ]
  }
}

data "aws_iam_policy_document" "ows_video_stepfunctions_policy_document" {
  statement {
    effect = "Allow"

    actions = [
      "states:StartExecution",
      "states:StopExecution",
    ]

    resources = [
      aws_sfn_state_machine.video_ingestion_workflow.id,
      aws_sfn_state_machine.video_approval_workflow.id,
      "${var.video_ingestion_workflow_state_machine_execution_arn}*",
      "${var.video_approval_workflow_state_machine_execution_arn}*",
    ]
  }
}

resource "aws_iam_policy" "daemon_video_stepfunctions_policy" {
  name   = "${var.environment}-stepfunctions-daemon-video-stepfunctions-policy"
  policy = data.aws_iam_policy_document.daemon_video_stepfunctions_policy_document.json
}

resource "aws_sfn_activity" "daemon_video_start_workflow" {
  name = "${var.environment}_daemon_video_start_workflow"
}

resource "aws_sfn_activity" "daemon_video_extract_metadata" {
  name = "${var.environment}_daemon_video_extract_metadata"
}

resource "aws_sfn_activity" "daemon_video_detect_black_intervals_at_beginning_and_end_of_video" {
  name = "${var.environment}_daemon_video_detect_black_intervals_at_beginning_and_end_of_video"
}

resource "aws_sfn_activity" "daemon_video_detect_silent_intervals_at_beginning_and_end_of_audio" {
  name = "${var.environment}_daemon_video_detect_silent_intervals_at_beginning_and_end_of_audio"
}

resource "aws_sfn_activity" "daemon_video_detect_video_location_and_dimensions_within_black_border" {
  name = "${var.environment}_daemon_video_detect_video_location_and_dimensions_within_black_border"
}

resource "aws_sfn_activity" "daemon_video_detect_max_volume" {
  name = "${var.environment}_daemon_video_detect_max_volume"
}

resource "aws_sfn_activity" "daemon_video_calculate_audio_stats" {
  name = "${var.environment}_daemon_video_calculate_audio_stats"
}

resource "aws_sfn_activity" "daemon_video_transfer_from_browser_to_s3" {
  name = "${var.environment}_daemon_video_transfer_from_browser_to_s3"
}

resource "aws_sfn_activity" "daemon_video_is_transfer_from_browser_to_s3_done" {
  name = "${var.environment}_daemon_video_is_transfer_from_browser_to_s3_done"
}

resource "aws_sfn_activity" "daemon_video_log_transfer_completed" {
  name = "${var.environment}_daemon_video_log_transfer_completed"
}

resource "aws_sfn_activity" "daemon_video_log_transfer_timed_out" {
  name = "${var.environment}_daemon_video_log_transfer_timed_out"
}

resource "aws_sfn_activity" "daemon_video_transfer_from_s3_to_s3" {
  name = "${var.environment}_daemon_video_transfer_from_s3_to_s3"
}

resource "aws_sfn_activity" "daemon_video_transfer_from_google_drive_to_s3" {
  name = "${var.environment}_daemon_video_transfer_from_google_drive_to_s3"
}

resource "aws_sfn_activity" "daemon_video_transfer_from_dropbox_to_s3" {
  name = "${var.environment}_daemon_video_transfer_from_dropbox_to_s3"
}

resource "aws_sfn_activity" "daemon_video_transfer_prores_from_s3_to_ripper" {
  name = "${var.environment}_daemon_video_transfer_prores_from_s3_to_ripper"
}

resource "aws_sfn_activity" "daemon_video_is_ripper_mezzanine_processing_done" {
  name = "${var.environment}_daemon_video_is_ripper_mezzanine_processing_done"
}

resource "aws_sfn_activity" "daemon_video_transfer_h264_from_s3_to_ripper" {
  name = "${var.environment}_daemon_video_transfer_h264_from_s3_to_ripper"
}

resource "aws_sfn_activity" "daemon_video_transfer_h264_from_s3_to_ripper_storage" {
  name = "${var.environment}_daemon_video_transfer_h264_from_s3_to_ripper_storage"
}

resource "aws_sfn_activity" "daemon_video_is_ripper_h264_processing_done" {
  name = "${var.environment}_daemon_video_is_ripper_h264_processing_done"
}

resource "aws_sfn_activity" "daemon_video_validate_metadata" {
  name = "${var.environment}_daemon_video_validate_metadata"
}

resource "aws_sfn_activity" "daemon_video_extract_prores_mezzanine_metadata" {
  name = "${var.environment}_daemon_video_extract_prores_mezzanine_metadata"
}

resource "aws_sfn_activity" "daemon_video_convert_thumbnails_to_tiffs" {
  name = "${var.environment}_daemon_video_convert_thumbnails_to_tiffs"
}

resource "aws_sfn_activity" "daemon_video_write_thumbnail_locations_to_video_asset_table" {
  name = "${var.environment}_daemon_video_write_thumbnail_locations_to_video_asset_table"
}

resource "aws_sfn_activity" "daemon_video_validate_analysis" {
  name = "${var.environment}_daemon_video_validate_analysis"
}

resource "aws_sfn_activity" "daemon_video_create_streamable_preview_and_thumbnails" {
  name = "${var.environment}_daemon_video_create_streamable_preview_and_thumbnails"
}

resource "aws_sfn_activity" "daemon_video_is_create_streamable_preview_and_thumbnails_done" {
  name = "${var.environment}_daemon_video_is_create_streamable_preview_and_thumbnails_done"
}

resource "aws_sfn_activity" "daemon_video_get_create_mezzanines_inputs" {
  name = "${var.environment}_daemon_video_get_create_mezzanines_inputs"
}

resource "aws_sfn_activity" "daemon_video_create_mezzanines" {
  name = "${var.environment}_daemon_video_create_mezzanines"
}

resource "aws_sfn_activity" "daemon_video_is_create_mezzanines_done" {
  name = "${var.environment}_daemon_video_is_create_mezzanines_done"
}

resource "aws_sfn_activity" "daemon_video_detect_explicit_or_suggestive_adult_content" {
  name = "${var.environment}_daemon_video_detect_explicit_or_suggestive_adult_content"
}

resource "aws_sfn_activity" "daemon_video_end_workflow" {
  name = "${var.environment}_daemon_video_end_workflow"
}

resource "aws_sfn_activity" "daemon_video_get_product_metadata" {
  name = "${var.environment}_daemon_video_get_product_metadata"
}

resource "aws_sfn_activity" "daemon_video_convert_default_thumbnail_to_tiff" {
  name = "${var.environment}_daemon_video_convert_default_thumbnail_to_tiff"
}

resource "aws_sfn_activity" "daemon_video_transfer_tiff_thumbnail_from_s3_to_ripper" {
  name = "${var.environment}_daemon_video_transfer_tiff_thumbnail_from_s3_to_ripper"
}

resource "aws_sfn_activity" "daemon_video_is_ripper_tiff_thumbnail_processing_done" {
  name = "${var.environment}_daemon_video_is_ripper_tiff_thumbnail_processing_done"
}

# State machine template
data "template_file" "video_ingestion_workflow_state_machine_definition" {
  template = file(
    "${path.module}/${var.video_ingestion_workflow_state_machine_definition_file}",
  )

  vars = {
    daemon_video_start_workflow_arn                                           = aws_sfn_activity.daemon_video_start_workflow.id
    daemon_video_extract_metadata_arn                                         = aws_sfn_activity.daemon_video_extract_metadata.id
    daemon_video_detect_black_intervals_at_beginning_and_end_of_video_arn     = aws_sfn_activity.daemon_video_detect_black_intervals_at_beginning_and_end_of_video.id
    daemon_video_detect_silent_intervals_at_beginning_and_end_of_audio_arn    = aws_sfn_activity.daemon_video_detect_silent_intervals_at_beginning_and_end_of_audio.id
    daemon_video_detect_video_location_and_dimensions_within_black_border_arn = aws_sfn_activity.daemon_video_detect_video_location_and_dimensions_within_black_border.id
    daemon_video_detect_max_volume_arn                                        = aws_sfn_activity.daemon_video_detect_max_volume.id
    daemon_video_calculate_audio_stats_arn                                    = aws_sfn_activity.daemon_video_calculate_audio_stats.id
    daemon_video_transfer_from_browser_to_s3_arn                              = aws_sfn_activity.daemon_video_transfer_from_browser_to_s3.id
    daemon_video_is_transfer_from_browser_to_s3_done_arn                      = aws_sfn_activity.daemon_video_is_transfer_from_browser_to_s3_done.id
    daemon_video_log_transfer_completed_arn                                   = aws_sfn_activity.daemon_video_log_transfer_completed.id
    daemon_video_log_transfer_timed_out_arn                                   = aws_sfn_activity.daemon_video_log_transfer_timed_out.id
    daemon_video_transfer_from_google_drive_to_s3_arn                         = aws_sfn_activity.daemon_video_transfer_from_google_drive_to_s3.id
    daemon_video_transfer_from_dropbox_to_s3_arn                              = aws_sfn_activity.daemon_video_transfer_from_dropbox_to_s3.id
    daemon_video_transfer_from_s3_to_s3_arn                                   = aws_sfn_activity.daemon_video_transfer_from_s3_to_s3.id
    daemon_video_validate_metadata_arn                                        = aws_sfn_activity.daemon_video_validate_metadata.id
    daemon_video_validate_analysis_arn                                        = aws_sfn_activity.daemon_video_validate_analysis.id
    daemon_video_create_streamable_preview_and_thumbnails_arn                 = aws_sfn_activity.daemon_video_create_streamable_preview_and_thumbnails.id
    daemon_video_is_create_streamable_preview_and_thumbnails_done_arn         = aws_sfn_activity.daemon_video_is_create_streamable_preview_and_thumbnails_done.id
    daemon_video_detect_explicit_or_suggestive_adult_content_arn              = aws_sfn_activity.daemon_video_detect_explicit_or_suggestive_adult_content.id
    daemon_video_end_workflow_arn                                             = aws_sfn_activity.daemon_video_end_workflow.id
  }
}

data "template_file" "video_approval_workflow_state_machine_definition" {
  template = file(
    "${path.module}/${var.video_approval_workflow_state_machine_definition_file}",
  )

  vars = {
    daemon_video_start_workflow_arn                                 = aws_sfn_activity.daemon_video_start_workflow.id
    daemon_video_transfer_prores_from_s3_to_ripper_arn              = aws_sfn_activity.daemon_video_transfer_prores_from_s3_to_ripper.id
    daemon_video_is_ripper_mezzanine_processing_done_arn            = aws_sfn_activity.daemon_video_is_ripper_mezzanine_processing_done.id
    daemon_video_transfer_h264_from_s3_to_ripper_arn                = aws_sfn_activity.daemon_video_transfer_h264_from_s3_to_ripper.id
    daemon_video_transfer_h264_from_s3_to_ripper_storage_arn        = aws_sfn_activity.daemon_video_transfer_h264_from_s3_to_ripper_storage.id
    daemon_video_is_ripper_h264_processing_done_arn                 = aws_sfn_activity.daemon_video_is_ripper_h264_processing_done.id
    daemon_video_get_create_mezzanines_inputs_arn                   = aws_sfn_activity.daemon_video_get_create_mezzanines_inputs.id
    daemon_video_create_mezzanines_arn                              = aws_sfn_activity.daemon_video_create_mezzanines.id
    daemon_video_is_create_mezzanines_done_arn                      = aws_sfn_activity.daemon_video_is_create_mezzanines_done.id
    daemon_video_end_workflow_arn                                   = aws_sfn_activity.daemon_video_end_workflow.id
    daemon_video_get_product_metadata_arn                           = aws_sfn_activity.daemon_video_get_product_metadata.id
    daemon_video_convert_default_thumbnail_to_tiff_arn              = aws_sfn_activity.daemon_video_convert_default_thumbnail_to_tiff.id
    daemon_video_transfer_tiff_thumbnail_from_s3_to_ripper_arn      = aws_sfn_activity.daemon_video_transfer_tiff_thumbnail_from_s3_to_ripper.id
    daemon_video_is_ripper_tiff_thumbnail_processing_done_arn       = aws_sfn_activity.daemon_video_is_ripper_tiff_thumbnail_processing_done.id
    daemon_video_extract_prores_mezzanine_metadata_arn              = aws_sfn_activity.daemon_video_extract_prores_mezzanine_metadata.id
    daemon_video_convert_thumbnails_to_tiffs_arn                    = aws_sfn_activity.daemon_video_convert_thumbnails_to_tiffs.id
    daemon_video_write_thumbnail_locations_to_video_asset_table_arn = aws_sfn_activity.daemon_video_write_thumbnail_locations_to_video_asset_table.id
  }
}

# see this document: https://docs.aws.amazon.com/step-functions/latest/dg/concept-create-iam-advanced.html
resource "aws_iam_role" "video_ingestion_workflow_state_machine_role" {
  name               = "${var.environment}_video_ingestion_workflow_state_machine_role"
  assume_role_policy = data.aws_iam_policy_document.assume_statemachines_role.json
}

resource "aws_iam_role" "video_approval_workflow_state_machine_role" {
  name               = "${var.environment}_video_approval_workflow_state_machine_role"
  assume_role_policy = data.aws_iam_policy_document.assume_statemachines_role.json
}

resource "aws_sfn_state_machine" "video_ingestion_workflow" {
  name       = "${var.environment}_${var.video_ingestion_workflow_state_machine_name}"
  role_arn   = aws_iam_role.video_ingestion_workflow_state_machine_role.arn
  definition = data.template_file.video_ingestion_workflow_state_machine_definition.rendered
  tags = {
    application_family = var.application_family
    environment        = var.environment
    service_name       = var.video_ingestion_workflow_state_machine_name
    terraformed        = true
  }
}

resource "aws_sfn_state_machine" "video_approval_workflow" {
  name       = "${var.environment}_${var.video_approval_workflow_state_machine_name}"
  role_arn   = aws_iam_role.video_approval_workflow_state_machine_role.arn
  definition = data.template_file.video_approval_workflow_state_machine_definition.rendered
  tags = {
    application_family = var.application_family
    environment        = var.environment
    service_name       = var.video_approval_workflow_state_machine_name
    terraformed        = true
  }
}

resource "aws_iam_policy" "ows_video_stepfunctions_policy" {
  name   = "${var.environment}-stepfunctions-ows-video-stepfunctions-policy"
  policy = data.aws_iam_policy_document.ows_video_stepfunctions_policy_document.json
}

