#####################################
## adjustment-file-import-workflow ##
#####################################

data "aws_lambda_function" "adjustment_file_import" {
  function_name = "${var.environment}-lambda-abacus-adjustment-file-import"
}

resource "aws_cloudwatch_log_group" "adjustment_file_import_workflow_logs" {
  name              = "/aws/vendedlogs/states/${var.environment}-adjustment-file-import-workflow"
  retention_in_days = 365 # 1 year retention required

  tags = {
    application_family = var.application_family
    environment        = var.environment
    service_name       = var.service_name
    terraformed        = true
  }
}

resource "aws_sfn_state_machine" "adjustment_file_import_workflow" {
  name     = "${var.environment}-adjustment-file-import-workflow"
  role_arn = aws_iam_role.adjustment_file_import_workflow_role.arn

  definition = jsonencode({
    Comment        = "Adjustment file import workflow"
    TimeoutSeconds = 1200 # 20 minutes overall timeout for entire workflow
    StartAt        = "ImportBatch"
    States = {
      ImportBatch = {
        Type           = "Task"
        Resource       = data.aws_lambda_function.adjustment_file_import.arn
        TimeoutSeconds = 900 # 15 minutes for import
        Parameters = {
          "target_id.$"       = "$.detail.metadata.target_id"
          "abacus_event_id.$" = "$.detail.data.abacus_event_id"
        }
        # Retry ONLY pre-execution infra errors. Import bulk-inserts are NOT
        # idempotent, so States.TaskFailed must not auto-retry (would duplicate rows).
        Retry = [
          {
            ErrorEquals = [
              "Lambda.ServiceException",
              "Lambda.TooManyRequestsException",
              "Lambda.SdkClientException"
            ]
            IntervalSeconds = 2
            MaxAttempts     = 3
            BackoffRate     = 2.0
          }
        ]
        Catch = [
          {
            ErrorEquals = ["States.ALL"]
            ResultPath  = "$.error"
            Next        = "ImportFailed"
          }
        ]
        End = true
      }
      ImportFailed = {
        Type  = "Fail"
        Cause = "Adjustment file import failed"
        Error = "ImportBatchError"
      }
    }
  })

  logging_configuration {
    log_destination        = "${aws_cloudwatch_log_group.adjustment_file_import_workflow_logs.arn}:*"
    include_execution_data = true
    level                  = "ALL"
  }

  tracing_configuration {
    enabled = true
  }

  tags = {
    application_family = var.application_family
    environment        = var.environment
    service_name       = var.service_name
    terraformed        = true
  }
}
